GLSL: Make sampling operations have agnostic precision qualifiers for desktop.
Desktop defaults to highp for samplers, but this should not apply to the built-in
functions, so make it appy only to user declarations.
diff --git a/Test/baseResults/spv.precisionNonESSamp.frag.out b/Test/baseResults/spv.precisionNonESSamp.frag.out
new file mode 100755
index 0000000..068db58
--- /dev/null
+++ b/Test/baseResults/spv.precisionNonESSamp.frag.out
@@ -0,0 +1,45 @@
+spv.precisionNonESSamp.frag
+// Module Version 10000
+// Generated by (magic number): 80002
+// Id's are bound by 20
+
+ Capability Shader
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Fragment 4 "main" 9 17
+ ExecutionMode 4 OriginUpperLeft
+ Source GLSL 450
+ Name 4 "main"
+ Name 9 "color"
+ Name 13 "s"
+ Name 17 "v"
+ Decorate 9(color) RelaxedPrecision
+ Decorate 9(color) Location 0
+ Decorate 13(s) RelaxedPrecision
+ Decorate 13(s) DescriptorSet 0
+ Decorate 14 RelaxedPrecision
+ Decorate 17(v) RelaxedPrecision
+ Decorate 17(v) Location 0
+ Decorate 18 RelaxedPrecision
+ Decorate 19 RelaxedPrecision
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeFloat 32
+ 7: TypeVector 6(float) 4
+ 8: TypePointer Output 7(fvec4)
+ 9(color): 8(ptr) Variable Output
+ 10: TypeImage 6(float) 2D sampled format:Unknown
+ 11: TypeSampledImage 10
+ 12: TypePointer UniformConstant 11
+ 13(s): 12(ptr) Variable UniformConstant
+ 15: TypeVector 6(float) 2
+ 16: TypePointer Input 15(fvec2)
+ 17(v): 16(ptr) Variable Input
+ 4(main): 2 Function None 3
+ 5: Label
+ 14: 11 Load 13(s)
+ 18: 15(fvec2) Load 17(v)
+ 19: 7(fvec4) ImageSampleImplicitLod 14 18
+ Store 9(color) 19
+ Return
+ FunctionEnd
diff --git a/Test/spv.precisionNonESSamp.frag b/Test/spv.precisionNonESSamp.frag
new file mode 100644
index 0000000..42a942f
--- /dev/null
+++ b/Test/spv.precisionNonESSamp.frag
@@ -0,0 +1,16 @@
+#version 450
+
+precision lowp sampler2D;
+precision lowp int;
+precision lowp float;
+
+uniform lowp sampler2D s;
+
+layout(location = 0) in lowp vec2 v;
+
+layout(location = 0) out lowp vec4 color;
+
+void main()
+{
+ color = texture(s, v);
+}
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index 48eff23..65a72cb 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -126,11 +126,6 @@
sampler.set(EbtFloat, Esd2D);
sampler.external = true;
defaultSamplerPrecision[computeSamplerTypeIndex(sampler)] = EpqLow;
- } else {
- // Non-ES profile
- // All default to highp.
- for (int type = 0; type < maxSamplerIndex; ++type)
- defaultSamplerPrecision[type] = EpqHigh;
}
// If we are parsing built-in computational variables/functions, it is meaningful to record
@@ -146,6 +141,13 @@
defaultPrecision[EbtUint] = EpqHigh;
defaultPrecision[EbtFloat] = EpqHigh;
}
+
+ if (profile != EEsProfile) {
+ // Non-ES profile
+ // All sampler precisions default to highp.
+ for (int type = 0; type < maxSamplerIndex; ++type)
+ defaultSamplerPrecision[type] = EpqHigh;
+ }
}
defaultPrecision[EbtSampler] = EpqLow;
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 63992f1..9e1f068 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -277,6 +277,7 @@
"spv.Operations.frag",
"spv.paramMemory.frag",
"spv.precision.frag",
+ "spv.precisionNonESSamp.frag",
"spv.prepost.frag",
"spv.qualifiers.vert",
"spv.sampleMaskOverrideCoverage.frag",