Slim down ROP handling for various formats
Change-Id: Ie2c008b40b83fa2d04f3008a5fcb9b554513639b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/36116
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/PixelRoutine.cpp b/src/Pipeline/PixelRoutine.cpp
index 495c785..ce85f3b 100644
--- a/src/Pipeline/PixelRoutine.cpp
+++ b/src/Pipeline/PixelRoutine.cpp
@@ -1404,38 +1404,26 @@
Pointer<Byte> buffer = cBuffer + 2 * x;
Int value = *Pointer<Int>(buffer);
- Int c01 = Extract(As<Int2>(current.x), 0);
+ Int channelMask = *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[bgraWriteMask & 0xF][0]));
+ Int c01 = Extract(As<Int2>(current.x), 0);
+ Int mask01 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8);
if(bgraWriteMask != 0x0000000F)
{
- Int masked = value;
- c01 &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[bgraWriteMask][0]));
- masked &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[~bgraWriteMask & 0xF][0]));
- c01 |= masked;
+ mask01 &= channelMask;
}
-
- c01 &= *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8);
- value &= *Pointer<Int>(constants + OFFSET(Constants,invMaskW4Q[0][0]) + xMask * 8);
- c01 |= value;
- *Pointer<Int>(buffer) = c01;
+ *Pointer<Int>(buffer) = (c01 & mask01) | (value & ~mask01);
buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = *Pointer<Int>(buffer);
Int c23 = Extract(As<Int2>(current.x), 1);
-
+ Int mask23 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
if(bgraWriteMask != 0x0000000F)
{
- Int masked = value;
- c23 &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[bgraWriteMask][0]));
- masked &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[~bgraWriteMask & 0xF][0]));
- c23 |= masked;
+ mask23 &= channelMask;
}
-
- c23 &= *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
- value &= *Pointer<Int>(constants + OFFSET(Constants,invMaskW4Q[0][2]) + xMask * 8);
- c23 |= value;
- *Pointer<Int>(buffer) = c23;
+ *Pointer<Int>(buffer) = (c23 & mask23) | (value & ~mask23);
}
break;
case VK_FORMAT_R5G6B5_UNORM_PACK16:
@@ -1443,38 +1431,26 @@
Pointer<Byte> buffer = cBuffer + 2 * x;
Int value = *Pointer<Int>(buffer);
- Int c01 = Extract(As<Int2>(current.x), 0);
+ Int channelMask = *Pointer<Int>(constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0]));
+ Int c01 = Extract(As<Int2>(current.x), 0);
+ Int mask01 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8);
if((bgraWriteMask & 0x00000007) != 0x00000007)
{
- Int masked = value;
- c01 &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0]));
- masked &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[~bgraWriteMask & 0x7][0]));
- c01 |= masked;
+ mask01 &= channelMask;
}
-
- c01 &= *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8);
- value &= *Pointer<Int>(constants + OFFSET(Constants,invMaskW4Q[0][0]) + xMask * 8);
- c01 |= value;
- *Pointer<Int>(buffer) = c01;
+ *Pointer<Int>(buffer) = (c01 & mask01) | (value & ~mask01);
buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = *Pointer<Int>(buffer);
Int c23 = Extract(As<Int2>(current.x), 1);
-
+ Int mask23 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
if((bgraWriteMask & 0x00000007) != 0x00000007)
{
- Int masked = value;
- c23 &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0]));
- masked &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[~bgraWriteMask & 0x7][0]));
- c23 |= masked;
+ mask23 &= channelMask;
}
-
- c23 &= *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
- value &= *Pointer<Int>(constants + OFFSET(Constants,invMaskW4Q[0][2]) + xMask * 8);
- c23 |= value;
- *Pointer<Int>(buffer) = c23;
+ *Pointer<Int>(buffer) = (c23 & mask23) | (value & ~mask23);
}
break;
case VK_FORMAT_B8G8R8A8_UNORM:
@@ -1482,35 +1458,24 @@
{
Pointer<Byte> buffer = cBuffer + x * 4;
Short4 value = *Pointer<Short4>(buffer);
+ Short4 channelMask = *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
- if(bgraWriteMask != 0x0000000F) // FIXME: Need for masking when XRGB && Fh?
+ Short4 mask01 = *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
+ if(bgraWriteMask != 0x0000000F)
{
- Short4 masked = value;
- c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
- masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[bgraWriteMask][0]));
- c01 |= masked;
+ mask01 &= channelMask;
}
-
- c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
- value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD01Q) + xMask * 8);
- c01 |= value;
- *Pointer<Short4>(buffer) = c01;
+ *Pointer<Short4>(buffer) = (c01 & mask01) | (value & ~mask01);
buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = *Pointer<Short4>(buffer);
- if(bgraWriteMask != 0x0000000F) // FIXME: Need for masking when XRGB && Fh?
+ Short4 mask23 = *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
+ if(bgraWriteMask != 0x0000000F)
{
- Short4 masked = value;
- c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
- masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[bgraWriteMask][0]));
- c23 |= masked;
+ mask23 &= channelMask;
}
-
- c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
- value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
- c23 |= value;
- *Pointer<Short4>(buffer) = c23;
+ *Pointer<Short4>(buffer) = (c23 & mask23) | (value & ~mask23);
}
break;
case VK_FORMAT_R8G8B8A8_UNORM:
@@ -1520,37 +1485,24 @@
{
Pointer<Byte> buffer = cBuffer + x * 4;
Short4 value = *Pointer<Short4>(buffer);
+ Short4 channelMask = *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[rgbaWriteMask][0]));
- bool masked = (rgbaWriteMask != 0x0000000F); // FIXME: Need for masking when XBGR && Fh?
-
- if(masked)
+ Short4 mask01 = *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
+ if(rgbaWriteMask != 0x0000000F)
{
- Short4 masked = value;
- c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[rgbaWriteMask][0]));
- masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[rgbaWriteMask][0]));
- c01 |= masked;
+ mask01 &= channelMask;
}
-
- c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
- value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD01Q) + xMask * 8);
- c01 |= value;
- *Pointer<Short4>(buffer) = c01;
+ *Pointer<Short4>(buffer) = (c01 & mask01) | (value & ~mask01);
buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = *Pointer<Short4>(buffer);
- if(masked)
+ Short4 mask23 = *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
+ if(rgbaWriteMask != 0x0000000F)
{
- Short4 masked = value;
- c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[rgbaWriteMask][0]));
- masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[rgbaWriteMask][0]));
- c23 |= masked;
+ mask23 &= channelMask;
}
-
- c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
- value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
- c23 |= value;
- *Pointer<Short4>(buffer) = c23;
+ *Pointer<Short4>(buffer) = (c23 & mask23) | (value & ~mask23);
}
break;
case VK_FORMAT_R8G8_UNORM: