Metal will incorrectly discard fragments with side effects under certain circumstances prematurely. The conditions are the following:
Fragment will always be discarded
Pre fragment depth fails fails
Modifies depth value for a constant value in the fragment shader. This constant value will also fail the depth test.
However, Metal will also discard the fragment even if it has operations with side effects inside the fragment shader before the discard operation.
Vulkan states the graphics pipeline to execute in the following order:
Pre fragment depth test (cannot discard here due to modifying depth value in fragment shader)
Fragment shader (where the depth is modified)
Post fragment depth test (where fragment should be discarded)
Therefore, we need to enforce fragment shader execution and not let Metal discard the fragment before that for such cases. This change adds an option to provide such utility.
Metal will incorrectly discard fragments with side effects under certain circumstances prematurely. The conditions are the following:
However, Metal will also discard the fragment even if it has operations with side effects inside the fragment shader before the discard operation.
Vulkan states the graphics pipeline to execute in the following order:
Therefore, we need to enforce fragment shader execution and not let Metal discard the fragment before that for such cases. This change adds an option to provide such utility.
Fixes https://github.com/KhronosGroup/SPIRV-Cross/issues/2322
If there's a better approach to accomplish this, I'm happy to investigate!