summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/PixelShaderGen.cpp
diff options
context:
space:
mode:
authorTechjar <tecknojar@gmail.com>2021-06-11 19:34:19 -0400
committerTechjar <tecknojar@gmail.com>2021-06-13 04:50:35 -0400
commit3da0976a8190211e43e285896bfb6dcd80dd7d50 (patch)
tree1068eae4f9eda122a6fa80f94fa1b443c6e498de /Source/Core/VideoCommon/PixelShaderGen.cpp
parent0c6e00ce0c8da1d81094bb41fea2eafe6b279891 (diff)
VideoCommon: Define scalar any() and all() functions in GLSL
This fixes bounding box shaders failing to compile under Vulkan, due to differences between GLSL and HLSL in the return value of vector comparisons and what types these functions accept. I included all() for the sake of completeness.
Diffstat (limited to 'Source/Core/VideoCommon/PixelShaderGen.cpp')
-rw-r--r--Source/Core/VideoCommon/PixelShaderGen.cpp10
1 files changed, 10 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp
index 988e85b199..5b9b6fa411 100644
--- a/Source/Core/VideoCommon/PixelShaderGen.cpp
+++ b/Source/Core/VideoCommon/PixelShaderGen.cpp
@@ -372,6 +372,16 @@ void WritePixelShaderCommonHeader(ShaderCode& out, APIType api_type,
"int3 iround(float3 x) {{ return int3(round(x)); }}\n"
"int4 iround(float4 x) {{ return int4(round(x)); }}\n\n");
+ // GLSL's any() and all() only accept vector types, while HLSL's also accept scalar types. We're
+ // adding these for convenience because while vector comparisons return a bool scalar in GLSL,
+ // allowing the results to be used directly in an if statement, they return a bool vector in HLSL,
+ // necessitating the use of any() or all() to reduce it to a scalar.
+ if (api_type == APIType::OpenGL || api_type == APIType::Vulkan)
+ {
+ out.Write("bool any(bool b) {{ return b; }}\n"
+ "bool all(bool b) {{ return b; }}\n\n");
+ }
+
if (api_type == APIType::OpenGL || api_type == APIType::Vulkan)
{
out.Write("SAMPLER_BINDING(0) uniform sampler2DArray samp[8];\n");