From c89b5a1a3ff6467a637b9a0cc2110b4e3a186499 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Tue, 20 Apr 2021 13:58:07 +0200 Subject: [PATCH] GLSL: Support shading rate builtins. --- .../frag/shading-rate.vk.nocompat.frag.vk | 10 ++++++++++ ...primitive-shading-rate.vk.nocompat.vert.vk | 9 +++++++++ .../vulkan/frag/shading-rate.vk.nocompat.frag | 9 +++++++++ .../primitive-shading-rate.vk.nocompat.vert | 8 ++++++++ spirv_glsl.cpp | 20 +++++++++++++++++++ 5 files changed, 56 insertions(+) create mode 100644 reference/shaders-no-opt/vulkan/frag/shading-rate.vk.nocompat.frag.vk create mode 100644 reference/shaders-no-opt/vulkan/vert/primitive-shading-rate.vk.nocompat.vert.vk create mode 100644 shaders-no-opt/vulkan/frag/shading-rate.vk.nocompat.frag create mode 100644 shaders-no-opt/vulkan/vert/primitive-shading-rate.vk.nocompat.vert diff --git a/reference/shaders-no-opt/vulkan/frag/shading-rate.vk.nocompat.frag.vk b/reference/shaders-no-opt/vulkan/frag/shading-rate.vk.nocompat.frag.vk new file mode 100644 index 00000000..e5c67115 --- /dev/null +++ b/reference/shaders-no-opt/vulkan/frag/shading-rate.vk.nocompat.frag.vk @@ -0,0 +1,10 @@ +#version 450 +#extension GL_EXT_fragment_shading_rate : require + +layout(location = 0) out uint FragColor; + +void main() +{ + FragColor = uint(gl_ShadingRateEXT); +} + diff --git a/reference/shaders-no-opt/vulkan/vert/primitive-shading-rate.vk.nocompat.vert.vk b/reference/shaders-no-opt/vulkan/vert/primitive-shading-rate.vk.nocompat.vert.vk new file mode 100644 index 00000000..47367233 --- /dev/null +++ b/reference/shaders-no-opt/vulkan/vert/primitive-shading-rate.vk.nocompat.vert.vk @@ -0,0 +1,9 @@ +#version 450 +#extension GL_EXT_fragment_shading_rate : require + +void main() +{ + gl_PrimitiveShadingRateEXT = 3; + gl_Position = vec4(1.0); +} + diff --git a/shaders-no-opt/vulkan/frag/shading-rate.vk.nocompat.frag b/shaders-no-opt/vulkan/frag/shading-rate.vk.nocompat.frag new file mode 100644 index 00000000..8aee6d35 --- /dev/null +++ b/shaders-no-opt/vulkan/frag/shading-rate.vk.nocompat.frag @@ -0,0 +1,9 @@ +#version 450 +#extension GL_EXT_fragment_shading_rate : require + +layout(location = 0) out uint FragColor; + +void main() +{ + FragColor = gl_ShadingRateEXT; +} diff --git a/shaders-no-opt/vulkan/vert/primitive-shading-rate.vk.nocompat.vert b/shaders-no-opt/vulkan/vert/primitive-shading-rate.vk.nocompat.vert new file mode 100644 index 00000000..95ac8d64 --- /dev/null +++ b/shaders-no-opt/vulkan/vert/primitive-shading-rate.vk.nocompat.vert @@ -0,0 +1,8 @@ +#version 450 +#extension GL_EXT_fragment_shading_rate : require + +void main() +{ + gl_PrimitiveShadingRateEXT = 3; + gl_Position = vec4(1.0); +} diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index 5acbf84a..83df8c84 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -8317,6 +8317,22 @@ string CompilerGLSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage) SPIRV_CROSS_THROW("Stencil export not supported in GLES."); } + case BuiltInPrimitiveShadingRateKHR: + { + if (!options.vulkan_semantics) + SPIRV_CROSS_THROW("Can only use PrimitiveShadingRateKHR in Vulkan GLSL."); + require_extension_internal("GL_EXT_fragment_shading_rate"); + return "gl_PrimitiveShadingRateEXT"; + } + + case BuiltInShadingRateKHR: + { + if (!options.vulkan_semantics) + SPIRV_CROSS_THROW("Can only use ShadingRateKHR in Vulkan GLSL."); + require_extension_internal("GL_EXT_fragment_shading_rate"); + return "gl_ShadingRateEXT"; + } + case BuiltInDeviceIndex: if (!options.vulkan_semantics) SPIRV_CROSS_THROW("Need Vulkan semantics for device group support."); @@ -15149,6 +15165,8 @@ void CompilerGLSL::cast_from_builtin_load(uint32_t source_id, std::string &expr, case BuiltInFragStencilRefEXT: case BuiltInInstanceCustomIndexNV: case BuiltInSampleMask: + case BuiltInPrimitiveShadingRateKHR: + case BuiltInShadingRateKHR: expected_type = SPIRType::Int; break; @@ -15193,6 +15211,8 @@ void CompilerGLSL::cast_to_builtin_store(uint32_t target_id, std::string &expr, case BuiltInViewportIndex: case BuiltInFragStencilRefEXT: case BuiltInSampleMask: + case BuiltInPrimitiveShadingRateKHR: + case BuiltInShadingRateKHR: expected_type = SPIRType::Int; break;