From f6c3d73700fc030ba99be886292ed2110e0836e2 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Mon, 25 Mar 2024 14:18:57 -0700 Subject: [PATCH] spirv2dxil: Output more specific metadata for whether draw sysvals are needed Part-of: --- src/microsoft/spirv_to_dxil/dxil_spirv_nir.c | 19 +++++++++++-------- src/microsoft/spirv_to_dxil/dxil_spirv_nir.h | 4 ++-- src/microsoft/spirv_to_dxil/spirv2dxil.c | 8 ++++---- src/microsoft/spirv_to_dxil/spirv_to_dxil.c | 4 +--- src/microsoft/spirv_to_dxil/spirv_to_dxil.h | 8 ++++++++ src/microsoft/vulkan/dzn_pipeline.c | 8 ++++---- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c index c62b1ef47977e..4cc54318aa847 100644 --- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c +++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c @@ -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); } diff --git a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h index 8d297817a5ad2..580d70614f6f9 100644 --- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h +++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h @@ -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 */ diff --git a/src/microsoft/spirv_to_dxil/spirv2dxil.c b/src/microsoft/spirv_to_dxil/spirv2dxil.c index 66696babc2420..e5f26fc739009 100644 --- a/src/microsoft/spirv_to_dxil/spirv2dxil.c +++ b/src/microsoft/spirv_to_dxil/spirv2dxil.c @@ -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; } } diff --git a/src/microsoft/spirv_to_dxil/spirv_to_dxil.c b/src/microsoft/spirv_to_dxil/spirv_to_dxil.c index db26f1a5b844a..eababf42fd964 100644 --- a/src/microsoft/spirv_to_dxil/spirv_to_dxil.c +++ b/src/microsoft/spirv_to_dxil/spirv_to_dxil.c @@ -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); diff --git a/src/microsoft/spirv_to_dxil/spirv_to_dxil.h b/src/microsoft/spirv_to_dxil/spirv_to_dxil.h index b1e8ac2d59ce6..bbeff9fa4b65c 100644 --- a/src/microsoft/spirv_to_dxil/spirv_to_dxil.h +++ b/src/microsoft/spirv_to_dxil/spirv_to_dxil.h @@ -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 { diff --git a/src/microsoft/vulkan/dzn_pipeline.c b/src/microsoft/vulkan/dzn_pipeline.c index b4868320c1bb1..7582d28c40829 100644 --- a/src/microsoft/vulkan/dzn_pipeline.c +++ b/src/microsoft/vulkan/dzn_pipeline.c @@ -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);