From bd2a4fb1b8d1dfcd2dd2244c2cf0d1cc13dfeceb Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Mon, 3 Jan 2022 06:08:35 -0800 Subject: [PATCH] microsoft/compiler: Add patch constant signature into PSV and as container blob Reviewed-by: Boris Brezillon Reviewed-by: Bill Kristiansen Part-of: --- src/microsoft/compiler/dxil_container.c | 26 ++++++++++++++++++------- src/microsoft/compiler/dxil_module.h | 9 +++++++++ src/microsoft/compiler/nir_to_dxil.c | 14 ++++++++++++- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/microsoft/compiler/dxil_container.c b/src/microsoft/compiler/dxil_container.c index 36ae33f9797..2ca6603c3ce 100644 --- a/src/microsoft/compiler/dxil_container.c +++ b/src/microsoft/compiler/dxil_container.c @@ -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 diff --git a/src/microsoft/compiler/dxil_module.h b/src/microsoft/compiler/dxil_module.h index 7a60812e8a6..ebb1c7550dd 100644 --- a/src/microsoft/compiler/dxil_module.h +++ b/src/microsoft/compiler/dxil_module.h @@ -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; diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index c3cf696f221..65f030cb23a 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -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);