From c176085909ab943bef46e835dcebe15e5f07fd4a Mon Sep 17 00:00:00 2001 From: Greg Fischer Date: Fri, 26 Feb 2021 11:34:51 -0700 Subject: [PATCH] Fix precision propagation around shifts Fixes #2541 --- Test/baseResults/spv.precision.frag.out | 41 ++++++++++++++++++++- Test/spv.precision.frag | 2 + glslang/MachineIndependent/Intermediate.cpp | 15 +++++--- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/Test/baseResults/spv.precision.frag.out b/Test/baseResults/spv.precision.frag.out index 973147d2..1d31230f 100644 --- a/Test/baseResults/spv.precision.frag.out +++ b/Test/baseResults/spv.precision.frag.out @@ -1,14 +1,15 @@ spv.precision.frag // Module Version 10000 // Generated by (magic number): 8000a -// Id's are bound by 146 +// Id's are bound by 165 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "main" 23 62 64 76 119 + EntryPoint Fragment 4 "main" 23 62 64 76 119 149 ExecutionMode 4 OriginUpperLeft Source ESSL 310 + SourceExtension "GL_OES_sample_variables" Name 4 "main" Name 12 "foo(vf3;" Name 11 "mv3" @@ -33,6 +34,7 @@ spv.precision.frag MemberName 117(S) 0 "a" MemberName 117(S) 1 "b" Name 119 "s" + Name 149 "gl_SampleMaskIn" Decorate 12(foo(vf3;) RelaxedPrecision Decorate 11(mv3) RelaxedPrecision Decorate 23(highfin) Location 2 @@ -97,6 +99,15 @@ spv.precision.frag Decorate 143 RelaxedPrecision Decorate 144 RelaxedPrecision Decorate 145 RelaxedPrecision + Decorate 149(gl_SampleMaskIn) Flat + Decorate 149(gl_SampleMaskIn) BuiltIn SampleMask + Decorate 153 RelaxedPrecision + Decorate 156 RelaxedPrecision + Decorate 159 RelaxedPrecision + Decorate 160 RelaxedPrecision + Decorate 162 RelaxedPrecision + Decorate 163 RelaxedPrecision + Decorate 164 RelaxedPrecision 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 @@ -147,6 +158,11 @@ spv.precision.frag 133: 6(float) Constant 1082549862 138: 6(float) Constant 1073741824 142: 6(float) Constant 1077936128 + 146: 95(int) Constant 1 + 147: TypeArray 39(int) 146 + 148: TypePointer Input 147 +149(gl_SampleMaskIn): 148(ptr) Variable Input + 150: TypePointer Input 39(int) 4(main): 2 Function None 3 5: Label 41(sum): 40(ptr) Variable Function @@ -156,6 +172,7 @@ spv.precision.frag 72(local_highp): 71(ptr) Variable Function 108(param): 16(ptr) Variable Function 135: 71(ptr) Variable Function + 156: 71(ptr) Variable Function 44: 39(int) Load 43(uniform_medium) 46: 39(int) Load 45(uniform_high) 47: 39(int) IAdd 44 46 @@ -249,6 +266,26 @@ spv.precision.frag 137: Label 145: 21(fvec4) Load 135 Store 76(mediumfout) 145 + 151: 150(ptr) AccessChain 149(gl_SampleMaskIn) 120 + 152: 39(int) Load 151 + 153: 39(int) Load 43(uniform_medium) + 154: 39(int) ShiftRightArithmetic 152 153 + 155: 14(bool) SGreaterThan 154 120 + SelectionMerge 158 None + BranchConditional 155 157 161 + 157: Label + 159: 21(fvec4) Load 76(mediumfout) + 160: 21(fvec4) VectorTimesScalar 159 138 + Store 156 160 + Branch 158 + 161: Label + 162: 21(fvec4) Load 76(mediumfout) + 163: 21(fvec4) VectorTimesScalar 162 142 + Store 156 163 + Branch 158 + 158: Label + 164: 21(fvec4) Load 156 + Store 76(mediumfout) 164 Return FunctionEnd 12(foo(vf3;): 9(fvec2) Function None 10 diff --git a/Test/spv.precision.frag b/Test/spv.precision.frag index 463afdf8..d887ce94 100644 --- a/Test/spv.precision.frag +++ b/Test/spv.precision.frag @@ -1,4 +1,5 @@ #version 310 es +#extension GL_OES_sample_variables : enable precision mediump float; in lowp float lowfin; in mediump float mediumfin; @@ -59,4 +60,5 @@ void main() mediumfout *= s.b; mediumfout = ((mediumfin * mediumfin > 4.2) ? 2.0 * mediumfout : 3.0 * mediumfout); + mediumfout = ((gl_SampleMaskIn[0] >> uniform_medium > 0) ? 2.0 * mediumfout : 3.0 * mediumfout); } diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index cadf6f34..d1123d4a 100644 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -3776,11 +3776,16 @@ void TIntermBinary::updatePrecision() { if (getBasicType() == EbtInt || getBasicType() == EbtUint || getBasicType() == EbtFloat || getBasicType() == EbtFloat16) { - getQualifier().precision = std::max(right->getQualifier().precision, left->getQualifier().precision); - if (getQualifier().precision != EpqNone) { - left->propagatePrecision(getQualifier().precision); - right->propagatePrecision(getQualifier().precision); - } + if (op == EOpRightShift || op == EOpLeftShift) { + // For shifts get precision from left side only and thus no need to propagate + getQualifier().precision = left->getQualifier().precision; + } else { + getQualifier().precision = std::max(right->getQualifier().precision, left->getQualifier().precision); + if (getQualifier().precision != EpqNone) { + left->propagatePrecision(getQualifier().precision); + right->propagatePrecision(getQualifier().precision); + } + } } }