From 4b62e90e71fea9ec9d5ba826b71ab40ad0c9adb8 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Mon, 27 Sep 2021 15:05:44 +0200 Subject: [PATCH] spirv: Let spirv_to_nir() users turn sysvals into input varyings This is an attempt at simplifying the spirv_to_nir() backend when it comes to choosing between system values and input varyings. Let's patch drivers to do the sysval to input varying conversion on their own so we can get rid of the frag_coord_is_varying field in spirv_to_nir_options and unconditionally create create sysvals for FragCoord, FrontFacing and PointCoord inputs instead of adding new xxx_is_{sysval,varying} flags. Signed-off-by: Boris Brezillon Suggested-by: Jason Ekstrand Reviewed-by: Jason Ekstrand Reviewed-by: Iago Toral Quiroga Reviewed-by: Lionel Landwerlin Reviewed-by: Hyunjun Ko Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_shader.c | 5 +++++ src/broadcom/vulkan/v3dv_pipeline.c | 6 ++++++ src/freedreno/vulkan/tu_shader.c | 5 +++++ src/gallium/drivers/freedreno/ir3/ir3_cmdline.c | 6 ++++++ src/gallium/frontends/lavapipe/lvp_pipeline.c | 6 ++++++ src/intel/vulkan/anv_pipeline.c | 5 +++++ src/mesa/main/glspirv.c | 8 ++++++++ src/panfrost/vulkan/panvk_vX_shader.c | 7 +++++++ 8 files changed, 48 insertions(+) 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; }