From 3ea2e51c8b9899d3d4b204b129d63e7d490aacb3 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Thu, 19 Mar 2026 12:10:19 -0400 Subject: [PATCH] treewide: Enable lowering of primitive ID in a bunch of Vulkan drivers Reviewed-by: Samuel Pitoiset Reviewed-by: Mary Guillemard Part-of: --- src/amd/vulkan/radv_shader.c | 1 + src/asahi/vulkan/hk_shader.c | 1 + src/broadcom/vulkan/v3dv_pipeline.c | 1 + src/freedreno/vulkan/tu_shader.cc | 10 ++++++++++ src/gallium/frontends/lavapipe/lvp_pipeline.c | 1 + src/imagination/pco/pco_nir.c | 1 + src/intel/vulkan/anv_shader_compile.c | 1 + src/intel/vulkan_hasvk/anv_pipeline.c | 1 + src/mesa/main/glspirv.c | 1 + src/microsoft/spirv_to_dxil/dxil_spirv_nir.c | 1 + 10 files changed, 19 insertions(+) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index cf8c226c21f..c9f3f0fdb0a 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -523,6 +523,7 @@ radv_shader_spirv_to_nir(struct radv_device *device, const struct radv_shader_st const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { .point_coord = true, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); diff --git a/src/asahi/vulkan/hk_shader.c b/src/asahi/vulkan/hk_shader.c index b046b22e7eb..a164e9c91d2 100644 --- a/src/asahi/vulkan/hk_shader.c +++ b/src/asahi/vulkan/hk_shader.c @@ -153,6 +153,7 @@ hk_preprocess_nir_internal(struct vk_physical_device *vk_pdev, nir_shader *nir) if (nir->info.stage == MESA_SHADER_FRAGMENT) { struct nir_lower_sysvals_to_varyings_options sysvals_opts = { .point_coord = true, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; nir_lower_sysvals_to_varyings(nir, &sysvals_opts); diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 7dc816a81af..6f5b4e8922f 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -298,6 +298,7 @@ preprocess_nir(nir_shader *nir) .frag_coord = true, .point_coord = true, .layer_id = true, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc index 1b7edaf6717..3a83a8dc81a 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -238,6 +238,16 @@ tu_spirv_to_nir(struct tu_device *dev, NIR_PASS(_, nir, nir_opt_copy_prop_vars); NIR_PASS(_, nir, nir_opt_dce); + if (stage == MESA_SHADER_FRAGMENT) { + /* We currently assume gl_PrimitiveID lives in a varying in fragment + * shaders but spirv_to_nir gives us a sysval. + */ + const nir_lower_sysvals_to_varyings_options sysval_options = { + .primitive_id = true, + }; + NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysval_options); + } + nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir)); if (nir->info.ray_queries > 0) { diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 3a5ae91fb36..39b8822b1d2 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -401,6 +401,7 @@ lvp_shader_lower(struct lvp_device *pdevice, nir_shader *nir, struct lvp_pipelin .frag_coord = true, .point_coord = true, .layer_id = true, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); diff --git a/src/imagination/pco/pco_nir.c b/src/imagination/pco/pco_nir.c index a19ce6db56d..69c41d34d18 100644 --- a/src/imagination/pco/pco_nir.c +++ b/src/imagination/pco/pco_nir.c @@ -539,6 +539,7 @@ void pco_preprocess_nir(pco_ctx *ctx, nir_shader *nir) const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { .frag_coord = true, .point_coord = true, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); NIR_PASS(_, nir, nir_lower_helper_writes, true); diff --git a/src/intel/vulkan/anv_shader_compile.c b/src/intel/vulkan/anv_shader_compile.c index 83c60045e2d..4bf599d70af 100644 --- a/src/intel/vulkan/anv_shader_compile.c +++ b/src/intel/vulkan/anv_shader_compile.c @@ -249,6 +249,7 @@ anv_shader_preprocess_nir(struct vk_physical_device *device, const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { .point_coord = true, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); diff --git a/src/intel/vulkan_hasvk/anv_pipeline.c b/src/intel/vulkan_hasvk/anv_pipeline.c index 74e3bb24a02..d85011ed291 100644 --- a/src/intel/vulkan_hasvk/anv_pipeline.c +++ b/src/intel/vulkan_hasvk/anv_pipeline.c @@ -94,6 +94,7 @@ anv_shader_stage_to_nir(struct anv_device *device, const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { .point_coord = true, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); diff --git a/src/mesa/main/glspirv.c b/src/mesa/main/glspirv.c index dd8a5fb41b6..6248ddc6fa6 100644 --- a/src/mesa/main/glspirv.c +++ b/src/mesa/main/glspirv.c @@ -306,6 +306,7 @@ _mesa_spirv_to_nir(struct gl_context *ctx, .frag_coord = !ctx->Const.GLSLFragCoordIsSysVal, .point_coord = !ctx->Const.GLSLPointCoordIsSysVal, .front_face = !ctx->Const.GLSLFrontFacingIsSysVal, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; 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 dba57b535d3..ceadc777592 100644 --- a/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c +++ b/src/microsoft/spirv_to_dxil/dxil_spirv_nir.c @@ -919,6 +919,7 @@ dxil_spirv_nir_passes(nir_shader *nir, .point_coord = true, .front_face = true, .layer_id = true, + .primitive_id = nir->info.stage == MESA_SHADER_FRAGMENT, }; NIR_PASS(_, nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings);