Vulkan: Avoid content restore by detecting no-op stencil
Previously, as long as stencil was enabled, it was considered that it is
also being modified. This caused stencil invalidate to be undone in a
number of situations, such as:
- glEnable(GL_STENCIL_TEST); // with func/ops default
- glDrawArrays();
- glInvalidateFramebuffer([GL_STENCIL_ATTACHMENT]);
- glClear(GL_DEPTH_BUFFER_BIT);
- Close render pass
In the above scenario, invalidation of stencil was undone at the end of
render pass.
In this change, the following cases are considered read-only stencil:
- Func = GL_NEVER, stencilFail = GL_KEEP
- Func = GL_ALWAYS, stencilPassDepth* = GL_KEEP
- stencilFail = GL_KEEP, stencilPassDepth* = GL_KEEP
Note that while the above scenario is fixed for no-op stencil, a similar
issue persists if stencil was not no-op. The reason stencil invalidate
is undone in that case is due to the fact that it's assumed any command
after the invalidate call will be a draw call that outputs to stencil,
but that is not the case with the glClear call in this example.
Bug: angleproject:4836
Change-Id: Ie2ea2d52b7c8ee2394f5456773a7ef434e2b2b16
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2461465
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by:
Jamie Madill <jmadill@chromium.org>
Reviewed-by:
Ian Elliott <ianelliott@google.com>
Showing
Please
register
or
sign in
to comment