From 17be3c652f7c2346db6d487ced0f9afa730d9dbb Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Wed, 2 May 2018 10:35:37 +0200 Subject: [PATCH] Deal with fake overloads when using combined image samplers. --- .../separate-combined-fake-overload.vk.frag | 12 ++++++++++ ...separate-combined-fake-overload.vk.frag.vk | 13 +++++++++++ .../separate-combined-fake-overload.vk.frag | 22 ++++++++++++++++++ ...separate-combined-fake-overload.vk.frag.vk | 23 +++++++++++++++++++ .../separate-combined-fake-overload.vk.frag | 21 +++++++++++++++++ spirv_glsl.cpp | 15 ++++++++++++ 6 files changed, 106 insertions(+) create mode 100644 reference/opt/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag create mode 100644 reference/opt/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag.vk create mode 100644 reference/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag create mode 100644 reference/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag.vk create mode 100644 shaders/vulkan/frag/separate-combined-fake-overload.vk.frag diff --git a/reference/opt/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag b/reference/opt/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag new file mode 100644 index 00000000..c17c8e6d --- /dev/null +++ b/reference/opt/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag @@ -0,0 +1,12 @@ +#version 450 + +layout(binding = 0) uniform sampler2D uSamp; +uniform sampler2D SPIRV_Cross_CombineduTuS; + +layout(location = 0) out vec4 FragColor; + +void main() +{ + FragColor = texture(uSamp, vec2(0.5)) + texture(SPIRV_Cross_CombineduTuS, vec2(0.5)); +} + diff --git a/reference/opt/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag.vk b/reference/opt/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag.vk new file mode 100644 index 00000000..5a5ec202 --- /dev/null +++ b/reference/opt/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag.vk @@ -0,0 +1,13 @@ +#version 450 + +layout(set = 0, binding = 0) uniform sampler2D uSamp; +layout(set = 0, binding = 1) uniform texture2D uT; +layout(set = 0, binding = 2) uniform sampler uS; + +layout(location = 0) out vec4 FragColor; + +void main() +{ + FragColor = texture(uSamp, vec2(0.5)) + texture(sampler2D(uT, uS), vec2(0.5)); +} + diff --git a/reference/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag b/reference/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag new file mode 100644 index 00000000..575c4187 --- /dev/null +++ b/reference/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag @@ -0,0 +1,22 @@ +#version 450 + +layout(binding = 0) uniform sampler2D uSamp; +uniform sampler2D SPIRV_Cross_CombineduTuS; + +layout(location = 0) out vec4 FragColor; + +vec4 samp(sampler2D uSamp_1) +{ + return texture(uSamp_1, vec2(0.5)); +} + +vec4 samp_1(sampler2D SPIRV_Cross_CombinedTS) +{ + return texture(SPIRV_Cross_CombinedTS, vec2(0.5)); +} + +void main() +{ + FragColor = samp(uSamp) + samp_1(SPIRV_Cross_CombineduTuS); +} + diff --git a/reference/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag.vk b/reference/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag.vk new file mode 100644 index 00000000..222b659e --- /dev/null +++ b/reference/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag.vk @@ -0,0 +1,23 @@ +#version 450 + +layout(set = 0, binding = 0) uniform sampler2D uSamp; +layout(set = 0, binding = 1) uniform texture2D uT; +layout(set = 0, binding = 2) uniform sampler uS; + +layout(location = 0) out vec4 FragColor; + +vec4 samp(sampler2D uSamp_1) +{ + return texture(uSamp_1, vec2(0.5)); +} + +vec4 samp(texture2D T, sampler S) +{ + return texture(sampler2D(T, S), vec2(0.5)); +} + +void main() +{ + FragColor = samp(uSamp) + samp(uT, uS); +} + diff --git a/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag b/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag new file mode 100644 index 00000000..22d18a26 --- /dev/null +++ b/shaders/vulkan/frag/separate-combined-fake-overload.vk.frag @@ -0,0 +1,21 @@ +#version 450 + +layout(location = 0) out vec4 FragColor; +layout(binding = 0) uniform sampler2D uSamp; +layout(binding = 1) uniform texture2D uT; +layout(binding = 2) uniform sampler uS; + +vec4 samp(sampler2D uSamp) +{ + return texture(uSamp, vec2(0.5)); +} + +vec4 samp(texture2D T, sampler S) +{ + return texture(sampler2D(T, S), vec2(0.5)); +} + +void main() +{ + FragColor = samp(uSamp) + samp(uT, uS); +} diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index e5e1c527..0d9b966f 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -8616,6 +8616,21 @@ void CompilerGLSL::add_function_overload(const SPIRFunction &func) type_id = type->parent_type; type = &get(type_id); } + + if (!combined_image_samplers.empty()) + { + // If we have combined image samplers, we cannot really trust the image and sampler arguments + // we pass down to callees, because they may be shuffled around. + // Ignore these arguments, to make sure that functions need to differ in some other way + // to be considered different overloads. + if (type->basetype == SPIRType::SampledImage || + (type->basetype == SPIRType::Image && type->image.sampled == 1) || + type->basetype == SPIRType::Sampler) + { + continue; + } + } + hasher.u32(type_id); } uint64_t types_hash = hasher.get();