spirv2dxil: Output more specific metadata for whether draw sysvals are needed

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28383>
This commit is contained in:
Jesse Natalie 2024-03-25 14:18:57 -07:00 committed by Marge Bot
parent 30b1a6750c
commit f6c3d73700
6 changed files with 30 additions and 21 deletions

View File

@ -757,11 +757,11 @@ lower_view_index_to_rt_layer(nir_shader *nir)
void
dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir,
const struct dxil_spirv_runtime_conf *conf,
bool *requires_runtime_data)
struct dxil_spirv_metadata *metadata)
{
glsl_type_singleton_init_or_ref();
*requires_runtime_data = false;
metadata->requires_runtime_data = false;
if (prev_stage_nir) {
if (nir->info.stage == MESA_SHADER_FRAGMENT) {
nir->info.clip_distance_array_size = prev_stage_nir->info.clip_distance_array_size;
@ -769,7 +769,7 @@ dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir,
if (nir->info.inputs_read & VARYING_BIT_PNTC) {
NIR_PASS_V(prev_stage_nir, dxil_spirv_write_pntc, conf);
NIR_PASS_V(nir, dxil_spirv_compute_pntc);
*requires_runtime_data = true;
metadata->requires_runtime_data = true;
}
}
@ -871,7 +871,7 @@ merge_ubos_and_ssbos(nir_shader *nir)
void
dxil_spirv_nir_passes(nir_shader *nir,
const struct dxil_spirv_runtime_conf *conf,
bool *requires_runtime_data)
struct dxil_spirv_metadata *metadata)
{
glsl_type_singleton_init_or_ref();
@ -935,8 +935,11 @@ dxil_spirv_nir_passes(nir_shader *nir,
if (conf->lower_view_index_to_rt_layer)
NIR_PASS_V(nir, lower_view_index_to_rt_layer);
*requires_runtime_data = false;
NIR_PASS(*requires_runtime_data, nir,
nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
metadata->needs_draw_sysvals = BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_FIRST_VERTEX) ||
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_BASE_INSTANCE);
NIR_PASS(metadata->requires_runtime_data, nir,
dxil_spirv_nir_lower_shader_system_values,
conf);
@ -1022,10 +1025,10 @@ dxil_spirv_nir_passes(nir_shader *nir,
nir->info.stage == MESA_SHADER_TESS_EVAL);
NIR_PASS_V(nir,
dxil_spirv_nir_lower_yz_flip,
conf, requires_runtime_data);
conf, &metadata->requires_runtime_data);
}
if (*requires_runtime_data) {
if (metadata->requires_runtime_data) {
add_runtime_data_var(nir, conf->runtime_data_cbv.register_space,
conf->runtime_data_cbv.base_shader_register);
}

View File

@ -41,12 +41,12 @@ dxil_spirv_nir_prep(nir_shader *nir);
void
dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir,
const struct dxil_spirv_runtime_conf *conf,
bool *requires_runtime_data);
struct dxil_spirv_metadata *metadata);
void
dxil_spirv_nir_passes(nir_shader *nir,
const struct dxil_spirv_runtime_conf *conf,
bool *requires_runtime_data);
struct dxil_spirv_metadata *metadata);
struct dxil_spirv_binding_remapping {
/* If ~0, don't lower to bindless */

View File

@ -115,8 +115,8 @@ compile_shader(const char *filename, gl_shader_stage shader_stage, struct shader
dxil_spirv_nir_prep(shader->nir);
bool requires_runtime_data;
dxil_spirv_nir_passes(shader->nir, conf, &requires_runtime_data);
struct dxil_spirv_metadata metadata = { 0 };
dxil_spirv_nir_passes(shader->nir, conf, &metadata);
if (debug)
nir_print_shader(shader->nir, stderr);
@ -247,8 +247,8 @@ main(int argc, char **argv)
for (int32_t prev = cur - 1; prev >= MESA_SHADER_VERTEX; --prev) {
if (!shaders[prev].nir)
continue;
bool requires_runtime_data;
dxil_spirv_nir_link(shaders[cur].nir, shaders[prev].nir, &conf, &requires_runtime_data);
struct dxil_spirv_metadata metadata = { 0 };
dxil_spirv_nir_link(shaders[cur].nir, shaders[prev].nir, &conf, &metadata);
break;
}
}

View File

@ -85,8 +85,7 @@ spirv_to_dxil(const uint32_t *words, size_t word_count,
dxil_spirv_nir_prep(nir);
bool requires_runtime_data;
dxil_spirv_nir_passes(nir, conf, &requires_runtime_data);
dxil_spirv_nir_passes(nir, conf, &out_dxil->metadata);
if (dgb_opts->dump_nir)
nir_print_shader(nir, stderr);
@ -104,7 +103,6 @@ spirv_to_dxil(const uint32_t *words, size_t word_count,
}
ralloc_free(nir);
out_dxil->metadata.requires_runtime_data = requires_runtime_data;
blob_finish_get_buffer(&dxil_blob, &out_dxil->binary.buffer,
&out_dxil->binary.size);

View File

@ -72,7 +72,15 @@ struct dxil_spirv_specialization {
};
struct dxil_spirv_metadata {
// Some sysval or other type of data is accessed which needs to be piped
// from the app/API implementation into the shader via a buffer
bool requires_runtime_data;
// Specifically if a vertex shader needs the first-vertex or base-instance
// sysval. These are relevant since these can come from an indirect arg
// buffer, and therefore piping them to the runtime data buffer is extra
// complex.
bool needs_draw_sysvals;
};
struct dxil_spirv_object {

View File

@ -253,8 +253,8 @@ dzn_pipeline_get_nir_shader(struct dzn_device *device,
.shader_model_max = dzn_get_shader_model(pdev),
};
bool requires_runtime_data;
dxil_spirv_nir_passes(*nir, &conf, &requires_runtime_data);
struct dxil_spirv_metadata metadata = { 0 };
dxil_spirv_nir_passes(*nir, &conf, &metadata);
if (stage == MESA_SHADER_VERTEX) {
bool needs_conv = false;
@ -972,11 +972,11 @@ dzn_graphics_pipeline_compile_shaders(struct dzn_device *device,
}};
assert(pipeline->templates.shaders[stage].nir);
bool requires_runtime_data;
struct dxil_spirv_metadata metadata = { 0 };
dxil_spirv_nir_link(pipeline->templates.shaders[stage].nir,
prev_stage != MESA_SHADER_NONE ?
pipeline->templates.shaders[prev_stage].nir : NULL,
&conf, &requires_runtime_data);
&conf, &metadata);
if (prev_stage != MESA_SHADER_NONE) {
memcpy(stages[stage].link_hashes[0], stages[prev_stage].spirv_hash, SHA1_DIGEST_LENGTH);