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.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index e0480d1..295660b 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp
@@ -4730,7 +4730,7 @@ 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 0000000..d5e21b6 --- /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 0000000..7868889 --- /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 6980065..acdb0a4 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -1295,7 +1295,7 @@ 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 80a75aa..9634262 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp
@@ -377,6 +377,7 @@ "spv.precision.frag", "spv.precisionArgs.frag", "spv.precisionNonESSamp.frag", + "spv.precisionTexture.frag", "spv.prepost.frag", "spv.privateVariableTypes.frag", "spv.qualifiers.vert",