Module: Mesa Branch: main Commit: 9d814c405bb3a40cea7556a61fe35aad3e24b020 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9d814c405bb3a40cea7556a61fe35aad3e24b020
Author: Pedro J. Estébanez <[email protected]> Date: Tue Jan 10 14:02:38 2023 +0100 microsoft/spirv_to_dxil: Let linking report the need of runtime data Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20608> --- src/microsoft/spirv_to_dxil/dxil_spirv_nir.c | 5 ++++- src/microsoft/spirv_to_dxil/dxil_spirv_nir.h | 7 ++++++- src/microsoft/spirv_to_dxil/spirv2dxil.c | 3 ++- src/microsoft/vulkan/dzn_pipeline.c | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c index 605e204c385..8349d805b20 100644 --- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c +++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c @@ -737,10 +737,12 @@ dxil_spirv_compute_pntc(nir_shader *nir) void dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir, - const struct dxil_spirv_runtime_conf *conf) + const struct dxil_spirv_runtime_conf *conf, + bool *requires_runtime_data) { glsl_type_singleton_init_or_ref(); + *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; @@ -748,6 +750,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; } } diff --git a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h index 3531d2aef1c..cdb4d00b5b3 100644 --- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h +++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.h @@ -31,9 +31,14 @@ void dxil_spirv_nir_prep(nir_shader *nir); +/* The pipeline will require runtime data if, and only if, any of the multiple reported + * runtime data required flags is true. + */ + void dxil_spirv_nir_link(nir_shader *nir, nir_shader *prev_stage_nir, - const struct dxil_spirv_runtime_conf *conf); + const struct dxil_spirv_runtime_conf *conf, + bool *requires_runtime_data); void dxil_spirv_nir_passes(nir_shader *nir, diff --git a/src/microsoft/spirv_to_dxil/spirv2dxil.c b/src/microsoft/spirv_to_dxil/spirv2dxil.c index 2598551468e..45227885d04 100644 --- a/src/microsoft/spirv_to_dxil/spirv2dxil.c +++ b/src/microsoft/spirv_to_dxil/spirv2dxil.c @@ -255,7 +255,8 @@ main(int argc, char **argv) for (int32_t prev = cur - 1; prev >= MESA_SHADER_VERTEX; --prev) { if (!shaders[prev].nir) continue; - dxil_spirv_nir_link(shaders[cur].nir, shaders[prev].nir, &conf); + bool requires_runtime_data; + dxil_spirv_nir_link(shaders[cur].nir, shaders[prev].nir, &conf, &requires_runtime_data); break; } } diff --git a/src/microsoft/vulkan/dzn_pipeline.c b/src/microsoft/vulkan/dzn_pipeline.c index 757743f37d3..1f1708ba40e 100644 --- a/src/microsoft/vulkan/dzn_pipeline.c +++ b/src/microsoft/vulkan/dzn_pipeline.c @@ -830,10 +830,11 @@ dzn_graphics_pipeline_compile_shaders(struct dzn_device *device, }}; assert(pipeline->templates.shaders[stage].nir); + bool requires_runtime_data; dxil_spirv_nir_link(pipeline->templates.shaders[stage].nir, prev_stage != MESA_SHADER_NONE ? pipeline->templates.shaders[prev_stage].nir : NULL, - &conf); + &conf, &requires_runtime_data); } u_foreach_bit(stage, active_stage_mask) {
