Root-cause evidence: ANGLE TranslatorSPIRV output for the same fragment shader with gl_PointCoord referenced before vs. after gl_FragCoord. Reserved id kIdFragCoord = 42. Overview flag kOverviewHasFragCoordMask = 0x80 (decimal 128) is encoded in the literal of the `OpExtInst %void %NonSemantic.ANGLE 0/128` instruction. ================================================================================ Shader A (BUG) -- gl_PointCoord first, gl_FragCoord second: #version 300 es precision mediump float; out vec4 c; void main() { vec2 p = gl_PointCoord; c = vec4(p, gl_FragCoord.x, 1.0); } Relevant translator output (out/asan/angle_shader_translator -s=e3 -b=v -o): OpEntryPoint Fragment %3 "main" %70 %80 %115 OpDecorate %115 BuiltIn FragCoord %115 = OpVariable %26 Input ; BuiltIn FragCoord %125 = OpExtInst %4 %1 0 <-- overview literal = 0, FragCoord bit NOT set gl_FragCoord is at GENERIC id %115 (not %42). Overview marker says "no FragCoord". When the dither-emulation transform later runs it will believe the shader has no FragCoord and add a SECOND one at %42. ================================================================================ Shader B (CORRECT) -- gl_FragCoord first, gl_PointCoord second: #version 300 es precision mediump float; out vec4 c; void main() { float x = gl_FragCoord.x; vec2 p = gl_PointCoord; c = vec4(p, x, 1.0); } Relevant translator output: OpEntryPoint Fragment %3 "main" %70 %42 %136 OpDecorate %42 BuiltIn FragCoord %42 = OpVariable %26 Input ; BuiltIn FragCoord %147 = OpExtInst %4 %1 128 <-- overview literal = 0x80, FragCoord bit SET gl_FragCoord is at RESERVED id %42 = kIdFragCoord. Overview marker says "has FragCoord". Dither transform will reuse %42. ================================================================================ Conclusion: shader-controlled lexical ordering of built-in references desyncs the overview-flag from the actual presence of BuiltIn FragCoord, because the mInputVaryings scan in TranslatorSPIRV.cpp:878-921 terminates with `break` at the gl_PointCoord / gl_SampleID arms instead of `continue`.