SPIRV-Cross/shaders-msl/frag/frag-discard-checks-continue-block.discard-checks.msl23.frag
Chip Davis aa5a8c482e MSL: Prevent stores to storage resources in discarded fragments.
Some Metal devices have a bug where storage resources can still be
written to even if the fragment is discarded. This is obviously a bug in
Metal, but bothering Apple to fix it will only fix it for newer
versions; therefore, a workaround is needed for older versions. I have
made this an option so that, in case the bug is ever fixed, the
workaround can be disabled.

This workaround is simple: if a fragment shader may discard its fragment
and writes to a storage resource, a variable representing the
`HelperInvocation` built-in is created and passed to all functions. The
flag is checked on all resource writes; writes do not occur when
`HelperInvocation` is `true`. This relies on the earlier workaround to
update `HelperInvocation` when the fragment is discarded.

Fixes at least 3 failures in the CTS.
2022-11-20 01:29:41 -08:00

18 lines
242 B
GLSL

#version 450
layout(binding=0, set=0, std430) buffer foo
{
int x;
};
layout(location=0) out vec4 fragColor;
void main(void)
{
if (gl_FragCoord.y == 7)
discard;
for (x = 0; x < gl_FragCoord.x; ++x)
;
fragColor = vec4(x, 0, 0, 1);
}