microsoft/compiler: Fix PSV0 for validator 1.8

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35595>
This commit is contained in:
Jesse Natalie
2025-06-17 16:29:07 -07:00
committed by Marge Bot
parent 48e8d6d207
commit 1fb0e76233
4 changed files with 60 additions and 38 deletions
+12 -8
View File
@@ -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]))
+1 -1
View File
@@ -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;
+5
View File
@@ -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;
+42 -29
View File
@@ -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 *