PixelRoutine::stencilOperation() refactor
stencilOperation() would sometimes perform unused stencilOperation()
calls. The logic was modified to make the stencilOperation() calls
only when we need them.
Bug: b/200826740
Change-Id: Ic9273dd8a0eec8819b9311ede49396ab07a4210f
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/66150
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 23992f4..7fb54d4 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -836,29 +836,20 @@
Byte8 PixelRoutine::stencilOperation(const Byte8 &bufferValue, const PixelProcessor::States::StencilOpState &ops, bool isBack, const Int &zMask, const Int &sMask)
{
- Byte8 fail;
- Byte8 zFail;
-
Byte8 pass = stencilOperation(bufferValue, ops.passOp, isBack);
- if(ops.depthFailOp != ops.passOp)
+ if(state.depthTestActive && ops.depthFailOp != ops.passOp) // zMask valid and values not the same
{
- zFail = stencilOperation(bufferValue, ops.depthFailOp, isBack);
+ Byte8 zFail = stencilOperation(bufferValue, ops.depthFailOp, isBack);
+
+ pass &= *Pointer<Byte8>(constants + OFFSET(Constants, maskB4Q) + 8 * zMask);
+ zFail &= *Pointer<Byte8>(constants + OFFSET(Constants, invMaskB4Q) + 8 * zMask);
+ pass |= zFail;
}
- if(ops.failOp != ops.passOp || ops.failOp != ops.depthFailOp)
+ if(ops.failOp != ops.passOp || (state.depthTestActive && ops.failOp != ops.depthFailOp))
{
- fail = stencilOperation(bufferValue, ops.failOp, isBack);
- }
-
- if(ops.failOp != ops.passOp || ops.failOp != ops.depthFailOp)
- {
- if(state.depthTestActive && ops.depthFailOp != ops.passOp) // zMask valid and values not the same
- {
- pass &= *Pointer<Byte8>(constants + OFFSET(Constants, maskB4Q) + 8 * zMask);
- zFail &= *Pointer<Byte8>(constants + OFFSET(Constants, invMaskB4Q) + 8 * zMask);
- pass |= zFail;
- }
+ Byte8 fail = stencilOperation(bufferValue, ops.failOp, isBack);
pass &= *Pointer<Byte8>(constants + OFFSET(Constants, maskB4Q) + 8 * sMask);
fail &= *Pointer<Byte8>(constants + OFFSET(Constants, invMaskB4Q) + 8 * sMask);