From 12c155f303c69ddf9172e665f6d0b76ff632ca50 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Tue, 30 Jun 2020 07:52:05 -0600 Subject: [PATCH] SPV: RelaxedPrecision: use the result precision for texture sampling. Fix #2298. The AST has two precisions, an operation precision and a result precision. Actual use of GLSL with mediump samplers wants the result precision, so pick that up instead of the operation precision. --- SPIRV/GlslangToSpv.cpp | 2 +- .../baseResults/spv.precisionTexture.frag.out | 120 ++++++++++++++++++ Test/spv.precisionTexture.frag | 24 ++++ glslang/MachineIndependent/ParseHelper.cpp | 2 +- gtests/Spv.FromFile.cpp | 1 + 5 files changed, 147 insertions(+), 2 deletions(-) create mode 100755 Test/baseResults/spv.precisionTexture.frag.out create mode 100644 Test/spv.precisionTexture.frag diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index e0480d18..295660b7 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -4730,7 +4730,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO translateArguments(*node->getAsAggregate(), arguments, lvalueCoherentFlags); else translateArguments(*node->getAsUnaryNode(), arguments); - spv::Decoration precision = TranslatePrecisionDecoration(node->getOperationPrecision()); + spv::Decoration precision = TranslatePrecisionDecoration(node->getType()); spv::Builder::TextureParameters params = { }; params.sampler = arguments[0]; diff --git a/Test/baseResults/spv.precisionTexture.frag.out b/Test/baseResults/spv.precisionTexture.frag.out new file mode 100755 index 00000000..d5e21b6c --- /dev/null +++ b/Test/baseResults/spv.precisionTexture.frag.out @@ -0,0 +1,120 @@ +spv.precisionTexture.frag +// Module Version 10000 +// Generated by (magic number): 8000a +// Id's are bound by 66 + + Capability Shader + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint Fragment 4 "main" 16 57 65 + ExecutionMode 4 OriginUpperLeft + Source ESSL 310 + Name 4 "main" + Name 9 "v" + Name 13 "texM" + Name 16 "vertex" + Name 21 "texH" + Name 52 "imageM" + Name 57 "coord" + Name 60 "imageH" + Name 65 "fragColor" + Decorate 9(v) RelaxedPrecision + Decorate 13(texM) RelaxedPrecision + Decorate 13(texM) DescriptorSet 0 + Decorate 13(texM) Binding 0 + Decorate 14 RelaxedPrecision + Decorate 16(vertex) Location 0 + Decorate 20 RelaxedPrecision + Decorate 21(texH) DescriptorSet 0 + Decorate 21(texH) Binding 1 + Decorate 26 RelaxedPrecision + Decorate 34 RelaxedPrecision + Decorate 41 RelaxedPrecision + Decorate 45 RelaxedPrecision + Decorate 52(imageM) RelaxedPrecision + Decorate 52(imageM) DescriptorSet 0 + Decorate 52(imageM) Binding 0 + Decorate 52(imageM) NonWritable + Decorate 53 RelaxedPrecision + Decorate 57(coord) Flat + Decorate 57(coord) Location 1 + Decorate 59 RelaxedPrecision + Decorate 60(imageH) DescriptorSet 0 + Decorate 60(imageH) Binding 1 + Decorate 60(imageH) NonWritable + Decorate 65(fragColor) RelaxedPrecision + Decorate 65(fragColor) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypeVector 6(float) 4 + 8: TypePointer Function 7(fvec4) + 10: TypeImage 6(float) 2D sampled format:Unknown + 11: TypeSampledImage 10 + 12: TypePointer UniformConstant 11 + 13(texM): 12(ptr) Variable UniformConstant + 15: TypePointer Input 7(fvec4) + 16(vertex): 15(ptr) Variable Input + 17: TypeVector 6(float) 2 + 21(texH): 12(ptr) Variable UniformConstant + 29: TypeInt 32 0 + 30: 29(int) Constant 2 + 31: TypePointer Input 6(float) + 42: TypeVector 6(float) 3 + 50: TypeImage 6(float) 2D nonsampled format:Rgba32f + 51: TypePointer UniformConstant 50 + 52(imageM): 51(ptr) Variable UniformConstant + 54: TypeInt 32 1 + 55: TypeVector 54(int) 2 + 56: TypePointer Input 55(ivec2) + 57(coord): 56(ptr) Variable Input + 60(imageH): 51(ptr) Variable UniformConstant + 64: TypePointer Output 7(fvec4) + 65(fragColor): 64(ptr) Variable Output + 4(main): 2 Function None 3 + 5: Label + 9(v): 8(ptr) Variable Function + 14: 11 Load 13(texM) + 18: 7(fvec4) Load 16(vertex) + 19: 17(fvec2) VectorShuffle 18 18 0 1 + 20: 7(fvec4) ImageSampleImplicitLod 14 19 + Store 9(v) 20 + 22: 11 Load 21(texH) + 23: 7(fvec4) Load 16(vertex) + 24: 17(fvec2) VectorShuffle 23 23 0 1 + 25: 7(fvec4) ImageSampleImplicitLod 22 24 + Store 9(v) 25 + 26: 11 Load 13(texM) + 27: 7(fvec4) Load 16(vertex) + 28: 17(fvec2) VectorShuffle 27 27 0 1 + 32: 31(ptr) AccessChain 16(vertex) 30 + 33: 6(float) Load 32 + 34: 7(fvec4) ImageSampleExplicitLod 26 28 Lod 33 + Store 9(v) 34 + 35: 11 Load 21(texH) + 36: 7(fvec4) Load 16(vertex) + 37: 17(fvec2) VectorShuffle 36 36 0 1 + 38: 31(ptr) AccessChain 16(vertex) 30 + 39: 6(float) Load 38 + 40: 7(fvec4) ImageSampleExplicitLod 35 37 Lod 39 + Store 9(v) 40 + 41: 11 Load 13(texM) + 43: 7(fvec4) Load 16(vertex) + 44: 42(fvec3) VectorShuffle 43 43 0 1 2 + 45: 7(fvec4) ImageSampleProjImplicitLod 41 44 + Store 9(v) 45 + 46: 11 Load 21(texH) + 47: 7(fvec4) Load 16(vertex) + 48: 42(fvec3) VectorShuffle 47 47 0 1 2 + 49: 7(fvec4) ImageSampleProjImplicitLod 46 48 + Store 9(v) 49 + 53: 50 Load 52(imageM) + 58: 55(ivec2) Load 57(coord) + 59: 7(fvec4) ImageRead 53 58 + Store 9(v) 59 + 61: 50 Load 60(imageH) + 62: 55(ivec2) Load 57(coord) + 63: 7(fvec4) ImageRead 61 62 + Store 9(v) 63 + Return + FunctionEnd diff --git a/Test/spv.precisionTexture.frag b/Test/spv.precisionTexture.frag new file mode 100644 index 00000000..78688896 --- /dev/null +++ b/Test/spv.precisionTexture.frag @@ -0,0 +1,24 @@ +#version 310 es +precision mediump float; +precision mediump int; +layout(binding = 0) uniform mediump sampler2D texM; +layout(binding = 1) uniform highp sampler2D texH; +layout(binding = 0, rgba32f) uniform readonly mediump image2D imageM; +layout(binding = 1, rgba32f) uniform readonly highp image2D imageH; + +layout(location = 0) in highp vec4 vertex; +layout(location = 1) flat in highp ivec2 coord; +layout(location = 0) out vec4 fragColor; + +void main() +{ + vec4 v; + v = texture(texM, vertex.xy); + v = texture(texH, vertex.xy); + v = textureLod(texM, vertex.xy, vertex.z); + v = textureLod(texH, vertex.xy, vertex.z); + v = textureProj(texM, vertex.xyz); + v = textureProj(texH, vertex.xyz); + v = imageLoad(imageM, coord); + v = imageLoad(imageH, coord); +} \ No newline at end of file diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 69800658..acdb0a4b 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -1295,7 +1295,7 @@ TIntermTyped* TParseContext::handleBuiltInFunctionCall(TSourceLoc loc, TIntermNo TIntermTyped *result = intermediate.addBuiltInFunctionCall(loc, function.getBuiltInOp(), function.getParamCount() == 1, arguments, function.getType()); - if (obeyPrecisionQualifiers()) + if (result != nullptr && obeyPrecisionQualifiers()) computeBuiltinPrecisions(*result, function); if (result == nullptr) { diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index 80a75aab..96342623 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -377,6 +377,7 @@ INSTANTIATE_TEST_CASE_P( "spv.precision.frag", "spv.precisionArgs.frag", "spv.precisionNonESSamp.frag", + "spv.precisionTexture.frag", "spv.prepost.frag", "spv.privateVariableTypes.frag", "spv.qualifiers.vert",