diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 33d68f63eae..5de1d488d88 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -536,6 +536,11 @@ radv_shader_compile_to_nir(struct radv_device *device, struct vk_shader_module * free(spec_entries); + const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { + .point_coord = true, + }; + NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); + /* We have to lower away local constant initializers right before we * inline functions. That way they get properly initialized at the top * of the function and not at the top of its caller. diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index c65120bf9c3..42e30323953 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -467,6 +467,12 @@ shader_module_compile_to_nir(struct v3dv_device *device, } assert(nir->info.stage == broadcom_shader_stage_to_gl(stage->stage)); + const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { + .frag_coord = true, + .point_coord = true, + }; + NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); + if (unlikely(V3D_DEBUG & (V3D_DEBUG_NIR | v3d_debug_flag_for_shader_stage( broadcom_shader_stage_to_gl(stage->stage))))) { diff --git a/src/freedreno/vulkan/tu_shader.c b/src/freedreno/vulkan/tu_shader.c index a1671e21fe8..f4d4e079c3d 100644 --- a/src/freedreno/vulkan/tu_shader.c +++ b/src/freedreno/vulkan/tu_shader.c @@ -112,6 +112,11 @@ tu_spirv_to_nir(struct tu_device *dev, assert(nir->info.stage == stage); nir_validate_shader(nir, "after spirv_to_nir"); + const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { + .point_coord = true, + }; + NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); + if (unlikely(dev->physical_device->instance->debug_flags & TU_DEBUG_NIR)) { fprintf(stderr, "translated nir:\n"); nir_print_shader(nir, stderr); diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c index 3a33f1535ec..88ff83421d3 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c @@ -251,6 +251,12 @@ load_spirv(const char *filename, const char *entry, gl_shader_stage stage) stage, entry, &spirv_options, ir3_get_compiler_options(compiler)); + const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { + .frag_coord = true, + .point_coord = true, + }; + NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); + nir_print_shader(nir, stdout); return nir; diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index 227ba68e043..ea3972c0b5b 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -529,6 +529,12 @@ lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline, free(spec_entries); + const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { + .frag_coord = true, + .point_coord = true, + }; + NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); + NIR_PASS_V(nir, nir_lower_variable_initializers, nir_var_function_temp); NIR_PASS_V(nir, nir_lower_returns); NIR_PASS_V(nir, nir_inline_functions); diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index 0ca05684ca1..61e6cdd3e83 100644 --- a/src/intel/vulkan/anv_pipeline.c +++ b/src/intel/vulkan/anv_pipeline.c @@ -194,6 +194,11 @@ anv_shader_compile_to_nir(struct anv_device *device, free(spec_entries); + const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { + .point_coord = true, + }; + NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); + if (INTEL_DEBUG & intel_debug_flag_for_shader_stage(stage)) { fprintf(stderr, "NIR (from SPIR-V) for %s shader:\n", gl_shader_stage_name(stage)); diff --git a/src/mesa/main/glspirv.c b/src/mesa/main/glspirv.c index 1668be08d95..eecb91a5944 100644 --- a/src/mesa/main/glspirv.c +++ b/src/mesa/main/glspirv.c @@ -279,6 +279,14 @@ _mesa_spirv_to_nir(struct gl_context *ctx, nir->info.separate_shader = linked_shader->Program->info.separate_shader; + /* Convert some sysvals to input varyings. */ + const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { + .frag_coord = !ctx->Const.GLSLFragCoordIsSysVal, + .point_coord = !ctx->Const.GLSLPointCoordIsSysVal, + .front_face = !ctx->Const.GLSLFrontFacingIsSysVal, + }; + NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); + /* We have to lower away local constant initializers right before we * inline functions. That way they get properly initialized at the top * of the function and not at the top of its caller. diff --git a/src/panfrost/vulkan/panvk_vX_shader.c b/src/panfrost/vulkan/panvk_vX_shader.c index c679b95f170..4cab9aaf8ae 100644 --- a/src/panfrost/vulkan/panvk_vX_shader.c +++ b/src/panfrost/vulkan/panvk_vX_shader.c @@ -69,6 +69,13 @@ panvk_spirv_to_nir(const void *code, assert(nir->info.stage == stage); nir_validate_shader(nir, "after spirv_to_nir"); + const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = { + .frag_coord = PAN_ARCH <= 5, + .point_coord = PAN_ARCH <= 5, + .front_face = PAN_ARCH <= 5, + }; + NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings); + return nir; }