microsoft/compiler: Add patch constant signature into PSV and as container blob

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14399>
This commit is contained in:
Jesse Natalie 2022-01-03 06:08:35 -08:00 committed by Marge Bot
parent 26247d506e
commit bd2a4fb1b8
3 changed files with 41 additions and 8 deletions

View File

@ -186,6 +186,12 @@ cleanup:
return retval;
}
static uint32_t
compute_input_output_table_dwords(unsigned input_vectors, unsigned output_vectors)
{
return ((output_vectors + 7) >> 3) * input_vectors * 4;
}
bool
dxil_container_add_state_validation(struct dxil_container *c,
const struct dxil_module *m,
@ -206,13 +212,13 @@ dxil_container_add_state_validation(struct dxil_container *c,
size += sizeof(uint32_t) + m->sem_index_table.size * sizeof(uint32_t);
if (m->num_sig_inputs || m->num_sig_outputs) {
if (m->num_sig_inputs || m->num_sig_outputs || m->num_sig_patch_consts) {
size += sizeof(uint32_t);
}
size += dxil_pvs_sig_size * m->num_sig_inputs;
size += dxil_pvs_sig_size * m->num_sig_outputs;
// size += dxil_pvs_sig_size * m->num_sig_patch_const...;
size += dxil_pvs_sig_size * m->num_sig_patch_consts;
state->state.sig_input_vectors = (uint8_t)m->num_psv_inputs;
@ -225,8 +231,13 @@ dxil_container_add_state_validation(struct dxil_container *c,
if (state->state.sig_input_vectors > 0) {
for (unsigned i = 0; i < 4; ++i) {
if (state->state.sig_output_vectors[i] > 0)
dependency_table_size += sizeof(uint32_t) * ((state->state.sig_output_vectors[i] + 7) >> 3) *
state->state.sig_input_vectors * 4;
dependency_table_size += sizeof(uint32_t) *
compute_input_output_table_dwords(state->state.sig_input_vectors,
state->state.sig_output_vectors[i]);
}
if (state->state.shader_stage == DXIL_HULL_SHADER && state->state.sig_patch_const_or_prim_vectors) {
dependency_table_size += sizeof(uint32_t) * compute_input_output_table_dwords(state->state.sig_input_vectors,
state->state.sig_patch_const_or_prim_vectors);
}
}
size += dependency_table_size;
@ -266,7 +277,7 @@ dxil_container_add_state_validation(struct dxil_container *c,
return false;
}
if (m->num_sig_inputs || m->num_sig_outputs) {
if (m->num_sig_inputs || m->num_sig_outputs || m->num_sig_patch_consts) {
if (!blob_write_bytes(&c->parts, &dxil_pvs_sig_size, sizeof(dxil_pvs_sig_size)))
return false;
@ -275,9 +286,10 @@ dxil_container_add_state_validation(struct dxil_container *c,
if (!blob_write_bytes(&c->parts, &m->psv_outputs, dxil_pvs_sig_size * m->num_sig_outputs))
return false;
}
// TODO: Write PatchConst...
if (!blob_write_bytes(&c->parts, &m->psv_patch_consts, dxil_pvs_sig_size * m->num_sig_patch_consts))
return false;
}
// TODO: Handle case when ViewID is used

View File

@ -182,16 +182,25 @@ struct dxil_module {
struct dxil_buffer buf;
/* The number of entries in the arrays below */
unsigned num_sig_inputs;
unsigned num_sig_outputs;
unsigned num_sig_patch_consts;
/* The number of "vectors" of elements. This is used to determine the sizes
* of the dependency tables.
*/
unsigned num_psv_inputs;
unsigned num_psv_outputs;
unsigned num_psv_patch_consts;
struct dxil_signature_record inputs[DXIL_SHADER_MAX_IO_ROWS];
struct dxil_signature_record outputs[DXIL_SHADER_MAX_IO_ROWS];
struct dxil_signature_record patch_consts[DXIL_SHADER_MAX_IO_ROWS];
struct dxil_psv_signature_element psv_inputs[DXIL_SHADER_MAX_IO_ROWS];
struct dxil_psv_signature_element psv_outputs[DXIL_SHADER_MAX_IO_ROWS];
struct dxil_psv_signature_element psv_patch_consts[DXIL_SHADER_MAX_IO_ROWS];
struct _mesa_string_buffer *sem_string_table;
struct dxil_psv_sem_index_table sem_index_table;

View File

@ -5247,7 +5247,7 @@ void dxil_fill_validation_state(struct ntd_context *ctx,
state->state.shader_stage = (uint8_t)ctx->mod.shader_kind;
state->state.sig_input_elements = (uint8_t)ctx->mod.num_sig_inputs;
state->state.sig_output_elements = (uint8_t)ctx->mod.num_sig_outputs;
//state->state.sig_patch_const_or_prim_elements = 0;
state->state.sig_patch_const_or_prim_elements = (uint8_t)ctx->mod.num_sig_patch_consts;
switch (ctx->mod.shader_kind) {
case DXIL_VERTEX_SHADER:
@ -5273,6 +5273,7 @@ void dxil_fill_validation_state(struct ntd_context *ctx,
state->state.psv0.hs.output_control_point_count = ctx->shader->info.tess.tcs_vertices_out;
state->state.psv0.hs.tessellator_domain = get_tessellator_domain(ctx->shader->info.tess._primitive_mode);
state->state.psv0.hs.tessellator_output_primitive = get_tessellator_output_primitive(&ctx->shader->info);
state->state.sig_patch_const_or_prim_vectors = ctx->mod.num_psv_patch_consts;
break;
default:
assert(0 && "Shader type not (yet) supported");
@ -5456,6 +5457,17 @@ nir_to_dxil(struct nir_shader *s, const struct nir_to_dxil_options *opts,
goto out;
}
if ((ctx->mod.shader_kind == DXIL_HULL_SHADER ||
ctx->mod.shader_kind == DXIL_DOMAIN_SHADER) &&
!dxil_container_add_io_signature(&container,
DXIL_PSG1,
ctx->mod.num_sig_patch_consts,
ctx->mod.patch_consts)) {
debug_printf("D3D12: failed to write patch constant signature\n");
retval = false;
goto out;
}
struct dxil_validation_state validation_state;
memset(&validation_state, 0, sizeof(validation_state));
dxil_fill_validation_state(ctx, &validation_state);