microsoft/compiler: DXIL validator 1.6 uses a new PSV struct version

Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17603>
This commit is contained in:
Jesse Natalie 2022-07-17 10:24:39 -07:00 committed by Marge Bot
parent 4d257929da
commit d9e575d4d7
4 changed files with 52 additions and 40 deletions

View File

@ -197,12 +197,14 @@ dxil_container_add_state_validation(struct dxil_container *c,
const struct dxil_module *m,
struct dxil_validation_state *state)
{
uint32_t psv1_size = sizeof(struct dxil_psv_runtime_info_1);
uint32_t psv_size = m->minor_validator >= 6 ?
sizeof(struct dxil_psv_runtime_info_2) :
sizeof(struct dxil_psv_runtime_info_1);
uint32_t resource_bind_info_size = 4 * sizeof(uint32_t);
uint32_t dxil_pvs_sig_size = sizeof(struct dxil_psv_signature_element);
uint32_t resource_count = state->num_resources;
uint32_t size = psv1_size + 2 * sizeof(uint32_t);
uint32_t size = psv_size + 2 * sizeof(uint32_t);
if (resource_count > 0) {
size += sizeof (uint32_t) +
resource_bind_info_size * resource_count;
@ -220,31 +222,31 @@ 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.sig_input_vectors = (uint8_t)m->num_psv_inputs;
state->state.psv1.sig_input_vectors = (uint8_t)m->num_psv_inputs;
for (unsigned i = 0; i < 4; ++i)
state->state.sig_output_vectors[i] = (uint8_t)m->num_psv_outputs[i];
state->state.psv1.sig_output_vectors[i] = (uint8_t)m->num_psv_outputs[i];
// TODO: Add viewID records size
uint32_t dependency_table_size = 0;
if (state->state.sig_input_vectors > 0) {
if (state->state.psv1.sig_input_vectors > 0) {
for (unsigned i = 0; i < 4; ++i) {
if (state->state.sig_output_vectors[i] > 0)
if (state->state.psv1.sig_output_vectors[i] > 0)
dependency_table_size += sizeof(uint32_t) *
compute_input_output_table_dwords(state->state.sig_input_vectors,
state->state.sig_output_vectors[i]);
compute_input_output_table_dwords(state->state.psv1.sig_input_vectors,
state->state.psv1.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);
if (state->state.psv1.shader_stage == DXIL_HULL_SHADER && state->state.psv1.sig_patch_const_or_prim_vectors) {
dependency_table_size += sizeof(uint32_t) * compute_input_output_table_dwords(state->state.psv1.sig_input_vectors,
state->state.psv1.sig_patch_const_or_prim_vectors);
}
}
if (state->state.shader_stage == DXIL_DOMAIN_SHADER &&
state->state.sig_patch_const_or_prim_vectors &&
state->state.sig_output_vectors[0]) {
if (state->state.psv1.shader_stage == DXIL_DOMAIN_SHADER &&
state->state.psv1.sig_patch_const_or_prim_vectors &&
state->state.psv1.sig_output_vectors[0]) {
dependency_table_size += sizeof(uint32_t) * compute_input_output_table_dwords(
state->state.sig_patch_const_or_prim_vectors, state->state.sig_output_vectors[0]);
state->state.psv1.sig_patch_const_or_prim_vectors, state->state.psv1.sig_output_vectors[0]);
}
size += dependency_table_size;
// TODO: Domain shader table goes here
@ -252,10 +254,10 @@ dxil_container_add_state_validation(struct dxil_container *c,
if (!add_part_header(c, DXIL_PSV0, size))
return false;
if (!blob_write_bytes(&c->parts, &psv1_size, sizeof(psv1_size)))
if (!blob_write_bytes(&c->parts, &psv_size, sizeof(psv_size)))
return false;
if (!blob_write_bytes(&c->parts, &state->state, psv1_size))
if (!blob_write_bytes(&c->parts, &state->state, psv_size))
return false;
if (!blob_write_bytes(&c->parts, &resource_count, sizeof(resource_count)))

View File

@ -82,7 +82,7 @@ struct dxil_resource {
};
struct dxil_validation_state {
struct dxil_psv_runtime_info_1 state;
struct dxil_psv_runtime_info_2 state;
const struct dxil_resource *resources;
uint32_t num_resources;
};

View File

@ -141,6 +141,13 @@ struct dxil_psv_runtime_info_1 {
uint8_t sig_output_vectors[4];
};
struct dxil_psv_runtime_info_2 {
struct dxil_psv_runtime_info_1 psv1;
uint32_t num_threads_x;
uint32_t num_threads_y;
uint32_t num_threads_z;
};
struct dxil_mdnode;
struct dxil_module;

View File

@ -5609,43 +5609,46 @@ void dxil_fill_validation_state(struct ntd_context *ctx,
{
state->num_resources = util_dynarray_num_elements(&ctx->resources, struct dxil_resource);
state->resources = (struct dxil_resource*)ctx->resources.data;
state->state.psv0.max_expected_wave_lane_count = UINT_MAX;
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 = (uint8_t)ctx->mod.num_sig_patch_consts;
state->state.psv1.psv0.max_expected_wave_lane_count = UINT_MAX;
state->state.psv1.shader_stage = (uint8_t)ctx->mod.shader_kind;
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;
switch (ctx->mod.shader_kind) {
case DXIL_VERTEX_SHADER:
state->state.psv0.vs.output_position_present = ctx->mod.info.has_out_position;
state->state.psv1.psv0.vs.output_position_present = ctx->mod.info.has_out_position;
break;
case DXIL_PIXEL_SHADER:
/* TODO: handle depth outputs */
state->state.psv0.ps.depth_output = ctx->mod.info.has_out_depth;
state->state.psv0.ps.sample_frequency =
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;
break;
case DXIL_COMPUTE_SHADER:
state->state.num_threads_x = ctx->shader->info.workgroup_size[0];
state->state.num_threads_y = ctx->shader->info.workgroup_size[1];
state->state.num_threads_z = ctx->shader->info.workgroup_size[2];
break;
case DXIL_GEOMETRY_SHADER:
state->state.max_vertex_count = ctx->shader->info.gs.vertices_out;
state->state.psv0.gs.input_primitive = dxil_get_input_primitive(ctx->shader->info.gs.input_primitive);
state->state.psv0.gs.output_toplology = dxil_get_primitive_topology(ctx->shader->info.gs.output_primitive);
state->state.psv0.gs.output_stream_mask = MAX2(ctx->shader->info.gs.active_stream_mask, 1);
state->state.psv0.gs.output_position_present = ctx->mod.info.has_out_position;
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;
break;
case DXIL_HULL_SHADER:
state->state.psv0.hs.input_control_point_count = ctx->tess_input_control_point_count;
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;
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;
break;
case DXIL_DOMAIN_SHADER:
state->state.psv0.ds.input_control_point_count = ctx->shader->info.tess.tcs_vertices_out;
state->state.psv0.ds.tessellator_domain = get_tessellator_domain(ctx->shader->info.tess._primitive_mode);
state->state.psv0.ds.output_position_present = ctx->mod.info.has_out_position;
state->state.sig_patch_const_or_prim_vectors = ctx->mod.num_psv_patch_consts;
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;
break;
default:
assert(0 && "Shader type not (yet) supported");