From 0c36c39103ab984611d25180a1893e726df3ebba Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Thu, 20 Nov 2025 17:01:32 -0500 Subject: [PATCH] spirv: Emit SYSTEM_VALUE_LAYER_ID for fragment shaders We have nir_lower_sysvals_to_varyings() so we can just have that lower it for the drivers who don't want a sysval. Most have to support the sysval version anyway for various lowering so making them all have to support both is pretty annoying. Reviewed-by: Alyssa Rosenzweig Reviewed-by: Emma Anholt Part-of: --- src/broadcom/vulkan/v3dv_pipeline.c | 1 + src/compiler/spirv/vtn_variables.c | 7 ++++--- src/freedreno/vulkan/tu_shader.cc | 1 + src/gallium/frontends/lavapipe/lvp_pipeline.c | 1 + src/microsoft/spirv_to_dxil/dxil_spirv_nir.c | 1 + 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index cdb568a7f93..f63a6d28642 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -294,6 +294,7 @@ preprocess_nir(nir_shader *nir) const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { .frag_coord = true, .point_coord = true, + .layer_id = true, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 78f1d4dc805..532e5e25459 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -941,16 +941,17 @@ vtn_get_builtin_location(struct vtn_builder *b, break; case SpvBuiltInLayer: case SpvBuiltInLayerPerViewNV: - *location = VARYING_SLOT_LAYER; if (b->shader->info.stage == MESA_SHADER_FRAGMENT) { - *mode = nir_var_shader_in; - *interp_mode = INTERP_MODE_FLAT; + *location = SYSTEM_VALUE_LAYER_ID; + set_mode_system_value(b, mode); } else if (b->shader->info.stage == MESA_SHADER_GEOMETRY) { + *location = VARYING_SLOT_LAYER; *mode = nir_var_shader_out; } else if (b->supported_capabilities.ShaderViewportIndexLayerEXT && (b->shader->info.stage == MESA_SHADER_VERTEX || b->shader->info.stage == MESA_SHADER_TESS_EVAL || b->shader->info.stage == MESA_SHADER_MESH)) { + *location = VARYING_SLOT_LAYER; *mode = nir_var_shader_out; } else { vtn_fail("invalid stage for SpvBuiltInLayer"); diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc index 3da4ed1b8ab..4d179f8a06d 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -232,6 +232,7 @@ tu_spirv_to_nir(struct tu_device *dev, const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { .point_coord = true, + .layer_id = true, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index b6dc0a3e7f2..71dea2949aa 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -333,6 +333,7 @@ lvp_shader_lower(struct lvp_device *pdevice, nir_shader *nir, struct lvp_pipelin const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { .frag_coord = true, .point_coord = true, + .layer_id = true, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); diff --git a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c index 1bd2c978718..42d03734b19 100644 --- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c +++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c @@ -905,6 +905,7 @@ dxil_spirv_nir_passes(nir_shader *nir, .frag_coord = true, .point_coord = true, .front_face = true, + .layer_id = true, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings);