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",