From 1fb0e7623306504c644d939f2a1c1719f8cdec92 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Tue, 17 Jun 2025 16:29:07 -0700 Subject: [PATCH] microsoft/compiler: Fix PSV0 for validator 1.8 Part-of: --- src/microsoft/compiler/dxil_container.c | 20 ++++--- src/microsoft/compiler/dxil_container.h | 2 +- src/microsoft/compiler/dxil_signature.h | 5 ++ src/microsoft/compiler/nir_to_dxil.c | 71 +++++++++++++++---------- 4 files changed, 60 insertions(+), 38 deletions(-) diff --git a/src/microsoft/compiler/dxil_container.c b/src/microsoft/compiler/dxil_container.c index 936bf9a792f..77a14cd5074 100644 --- a/src/microsoft/compiler/dxil_container.c +++ b/src/microsoft/compiler/dxil_container.c @@ -200,14 +200,18 @@ dxil_container_add_state_validation(struct dxil_container *c, const struct dxil_module *m, struct dxil_validation_state *state) { - uint32_t psv_size = m->minor_validator >= 6 ? - sizeof(struct dxil_psv_runtime_info_2) : - sizeof(struct dxil_psv_runtime_info_1); + uint32_t psv_size = m->minor_validator >= 8 ? + sizeof(struct dxil_psv_runtime_info_3) : m->minor_validator >= 6 ? + sizeof(struct dxil_psv_runtime_info_2) : sizeof(struct dxil_psv_runtime_info_1); uint32_t resource_bind_info_size = m->minor_validator >= 6 ? sizeof(struct dxil_resource_v1) : sizeof(struct dxil_resource_v0); uint32_t dxil_pvs_sig_size = sizeof(struct dxil_psv_signature_element); uint32_t resource_count = state->num_resources; + struct dxil_psv_runtime_info_3 *psv3 = &state->state; + struct dxil_psv_runtime_info_2 *psv2 = &psv3->psv2; + struct dxil_psv_runtime_info_1 *psv1 = &psv2->psv1; + uint32_t size = psv_size + 2 * sizeof(uint32_t); if (resource_count > 0) { size += sizeof (uint32_t) + @@ -226,12 +230,12 @@ dxil_container_add_state_validation(struct dxil_container *c, size += dxil_pvs_sig_size * m->num_sig_outputs; size += dxil_pvs_sig_size * m->num_sig_patch_consts; - state->state.psv1.sig_input_vectors = (uint8_t)m->num_psv_inputs; + psv1->sig_input_vectors = (uint8_t)m->num_psv_inputs; for (unsigned i = 0; i < 4; ++i) - state->state.psv1.sig_output_vectors[i] = (uint8_t)m->num_psv_outputs[i]; + psv1->sig_output_vectors[i] = (uint8_t)m->num_psv_outputs[i]; - if (state->state.psv1.uses_view_id) { + if (psv1->uses_view_id) { for (unsigned i = 0; i < 4; ++i) size += m->dependency_table_dwords_per_input[i] * sizeof(uint32_t); } @@ -297,7 +301,7 @@ dxil_container_add_state_validation(struct dxil_container *c, if (m->shader_kind == DXIL_GEOMETRY_SHADER && m->minor_validator < 8) { bool zero_view_id_deps = false, zero_io_deps = false; for (int i = 3; i >= 0; --i) { - if (state->state.psv1.uses_view_id && m->dependency_table_dwords_per_input[i]) { + if (psv1->uses_view_id && m->dependency_table_dwords_per_input[i]) { if (zero_view_id_deps) memset(m->viewid_dependency_table[i], 0, sizeof(uint32_t) * m->dependency_table_dwords_per_input[i]); zero_view_id_deps = true; @@ -310,7 +314,7 @@ dxil_container_add_state_validation(struct dxil_container *c, } } - if (state->state.psv1.uses_view_id) { + if (psv1->uses_view_id) { for (unsigned i = 0; i < 4; ++i) if (!blob_write_bytes(&c->parts, m->viewid_dependency_table[i], sizeof(uint32_t) * m->dependency_table_dwords_per_input[i])) diff --git a/src/microsoft/compiler/dxil_container.h b/src/microsoft/compiler/dxil_container.h index b3279ee108a..2c3f17c4ced 100644 --- a/src/microsoft/compiler/dxil_container.h +++ b/src/microsoft/compiler/dxil_container.h @@ -88,7 +88,7 @@ struct dxil_resource_v1 { }; struct dxil_validation_state { - struct dxil_psv_runtime_info_2 state; + struct dxil_psv_runtime_info_3 state; union { const struct dxil_resource_v0 *v0; const struct dxil_resource_v1 *v1; diff --git a/src/microsoft/compiler/dxil_signature.h b/src/microsoft/compiler/dxil_signature.h index a7fdc98e689..a40ddce47fc 100644 --- a/src/microsoft/compiler/dxil_signature.h +++ b/src/microsoft/compiler/dxil_signature.h @@ -148,6 +148,11 @@ struct dxil_psv_runtime_info_2 { uint32_t num_threads_z; }; +struct dxil_psv_runtime_info_3 { + struct dxil_psv_runtime_info_2 psv2; + uint32_t entry_function_name; +}; + struct dxil_mdnode; struct dxil_module; diff --git a/src/microsoft/compiler/nir_to_dxil.c b/src/microsoft/compiler/nir_to_dxil.c index 9b14b9d74b3..b61826faaab 100644 --- a/src/microsoft/compiler/nir_to_dxil.c +++ b/src/microsoft/compiler/nir_to_dxil.c @@ -6366,56 +6366,69 @@ void dxil_fill_validation_state(struct ntd_context *ctx, sizeof(struct dxil_resource_v1) : sizeof(struct dxil_resource_v0); state->num_resources = ctx->resources.size / resource_element_size; state->resources.v0 = (struct dxil_resource_v0*)ctx->resources.data; + struct dxil_psv_runtime_info_3 *psv3 = &state->state; + struct dxil_psv_runtime_info_2 *psv2 = &psv3->psv2; + struct dxil_psv_runtime_info_1 *psv1 = &psv2->psv1; + struct dxil_psv_runtime_info_0 *psv0 = &psv1->psv0; if (ctx->shader->info.subgroup_size >= SUBGROUP_SIZE_REQUIRE_4) { - state->state.psv1.psv0.max_expected_wave_lane_count = ctx->shader->info.subgroup_size; - state->state.psv1.psv0.min_expected_wave_lane_count = ctx->shader->info.subgroup_size; + psv0->max_expected_wave_lane_count = ctx->shader->info.subgroup_size; + psv0->min_expected_wave_lane_count = ctx->shader->info.subgroup_size; } else { - state->state.psv1.psv0.max_expected_wave_lane_count = UINT_MAX; + psv0->max_expected_wave_lane_count = UINT_MAX; } - state->state.psv1.shader_stage = (uint8_t)ctx->mod.shader_kind; - state->state.psv1.uses_view_id = (uint8_t)ctx->mod.feats.view_id; - state->state.psv1.sig_input_elements = (uint8_t)ctx->mod.num_sig_inputs; - state->state.psv1.sig_output_elements = (uint8_t)ctx->mod.num_sig_outputs; - state->state.psv1.sig_patch_const_or_prim_elements = (uint8_t)ctx->mod.num_sig_patch_consts; + psv1->shader_stage = (uint8_t)ctx->mod.shader_kind; + psv1->uses_view_id = (uint8_t)ctx->mod.feats.view_id; + psv1->sig_input_elements = (uint8_t)ctx->mod.num_sig_inputs; + psv1->sig_output_elements = (uint8_t)ctx->mod.num_sig_outputs; + psv1->sig_patch_const_or_prim_elements = (uint8_t)ctx->mod.num_sig_patch_consts; switch (ctx->mod.shader_kind) { case DXIL_VERTEX_SHADER: - state->state.psv1.psv0.vs.output_position_present = ctx->mod.info.has_out_position; + psv0->vs.output_position_present = ctx->mod.info.has_out_position; break; case DXIL_PIXEL_SHADER: /* TODO: handle depth outputs */ - state->state.psv1.psv0.ps.depth_output = ctx->mod.info.has_out_depth; - state->state.psv1.psv0.ps.sample_frequency = - ctx->mod.info.has_per_sample_input; + psv0->ps.depth_output = ctx->mod.info.has_out_depth; + psv0->ps.sample_frequency = ctx->mod.info.has_per_sample_input; break; case DXIL_COMPUTE_SHADER: - state->state.num_threads_x = MAX2(ctx->shader->info.workgroup_size[0], 1); - state->state.num_threads_y = MAX2(ctx->shader->info.workgroup_size[1], 1); - state->state.num_threads_z = MAX2(ctx->shader->info.workgroup_size[2], 1); + psv2->num_threads_x = MAX2(ctx->shader->info.workgroup_size[0], 1); + psv2->num_threads_y = MAX2(ctx->shader->info.workgroup_size[1], 1); + psv2->num_threads_z = MAX2(ctx->shader->info.workgroup_size[2], 1); break; case DXIL_GEOMETRY_SHADER: - state->state.psv1.max_vertex_count = ctx->shader->info.gs.vertices_out; - state->state.psv1.psv0.gs.input_primitive = dxil_get_input_primitive(ctx->shader->info.gs.input_primitive); - state->state.psv1.psv0.gs.output_toplology = dxil_get_primitive_topology(ctx->shader->info.gs.output_primitive); - state->state.psv1.psv0.gs.output_stream_mask = MAX2(ctx->shader->info.gs.active_stream_mask, 1); - state->state.psv1.psv0.gs.output_position_present = ctx->mod.info.has_out_position; + psv1->max_vertex_count = ctx->shader->info.gs.vertices_out; + psv0->gs.input_primitive = dxil_get_input_primitive(ctx->shader->info.gs.input_primitive); + psv0->gs.output_toplology = dxil_get_primitive_topology(ctx->shader->info.gs.output_primitive); + psv0->gs.output_stream_mask = MAX2(ctx->shader->info.gs.active_stream_mask, 1); + psv0->gs.output_position_present = ctx->mod.info.has_out_position; break; case DXIL_HULL_SHADER: - state->state.psv1.psv0.hs.input_control_point_count = ctx->tess_input_control_point_count; - state->state.psv1.psv0.hs.output_control_point_count = ctx->shader->info.tess.tcs_vertices_out; - state->state.psv1.psv0.hs.tessellator_domain = get_tessellator_domain(ctx->shader->info.tess._primitive_mode); - state->state.psv1.psv0.hs.tessellator_output_primitive = get_tessellator_output_primitive(&ctx->shader->info); - state->state.psv1.sig_patch_const_or_prim_vectors = ctx->mod.num_psv_patch_consts; + psv0->hs.input_control_point_count = ctx->tess_input_control_point_count; + psv0->hs.output_control_point_count = ctx->shader->info.tess.tcs_vertices_out; + psv0->hs.tessellator_domain = get_tessellator_domain(ctx->shader->info.tess._primitive_mode); + psv0->hs.tessellator_output_primitive = get_tessellator_output_primitive(&ctx->shader->info); + psv1->sig_patch_const_or_prim_vectors = ctx->mod.num_psv_patch_consts; break; case DXIL_DOMAIN_SHADER: - state->state.psv1.psv0.ds.input_control_point_count = ctx->shader->info.tess.tcs_vertices_out; - state->state.psv1.psv0.ds.tessellator_domain = get_tessellator_domain(ctx->shader->info.tess._primitive_mode); - state->state.psv1.psv0.ds.output_position_present = ctx->mod.info.has_out_position; - state->state.psv1.sig_patch_const_or_prim_vectors = ctx->mod.num_psv_patch_consts; + psv0->ds.input_control_point_count = ctx->shader->info.tess.tcs_vertices_out; + psv0->ds.tessellator_domain = get_tessellator_domain(ctx->shader->info.tess._primitive_mode); + psv0->ds.output_position_present = ctx->mod.info.has_out_position; + psv1->sig_patch_const_or_prim_vectors = ctx->mod.num_psv_patch_consts; break; default: assert(0 && "Shader type not (yet) supported"); } + + if (ctx->mod.minor_validator >= 8) { + nir_function_impl *impl = nir_shader_get_entrypoint(ctx->shader); + if (impl && impl->function->name) { + psv3->entry_function_name = ctx->mod.sem_string_table->length; + _mesa_string_buffer_append_len(ctx->mod.sem_string_table, impl->function->name, strlen(impl->function->name) + 1); + } else { + psv3->entry_function_name = 0; + } + } } static nir_variable *