Commit 30d3c8af by Chris Forbes

Slim down ROP handling for various formats

Change-Id: Ie2c008b40b83fa2d04f3008a5fcb9b554513639b Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/36116Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent 2eae4389
...@@ -1404,38 +1404,26 @@ namespace sw ...@@ -1404,38 +1404,26 @@ namespace sw
Pointer<Byte> buffer = cBuffer + 2 * x; Pointer<Byte> buffer = cBuffer + 2 * x;
Int value = *Pointer<Int>(buffer); 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) if(bgraWriteMask != 0x0000000F)
{ {
Int masked = value; mask01 &= channelMask;
c01 &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[bgraWriteMask][0]));
masked &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[~bgraWriteMask & 0xF][0]));
c01 |= masked;
} }
*Pointer<Int>(buffer) = (c01 & mask01) | (value & ~mask01);
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;
buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index])); buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = *Pointer<Int>(buffer); value = *Pointer<Int>(buffer);
Int c23 = Extract(As<Int2>(current.x), 1); Int c23 = Extract(As<Int2>(current.x), 1);
Int mask23 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
if(bgraWriteMask != 0x0000000F) if(bgraWriteMask != 0x0000000F)
{ {
Int masked = value; mask23 &= channelMask;
c23 &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[bgraWriteMask][0]));
masked &= *Pointer<Int>(constants + OFFSET(Constants,mask5551Q[~bgraWriteMask & 0xF][0]));
c23 |= masked;
} }
*Pointer<Int>(buffer) = (c23 & mask23) | (value & ~mask23);
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;
} }
break; break;
case VK_FORMAT_R5G6B5_UNORM_PACK16: case VK_FORMAT_R5G6B5_UNORM_PACK16:
...@@ -1443,38 +1431,26 @@ namespace sw ...@@ -1443,38 +1431,26 @@ namespace sw
Pointer<Byte> buffer = cBuffer + 2 * x; Pointer<Byte> buffer = cBuffer + 2 * x;
Int value = *Pointer<Int>(buffer); 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) if((bgraWriteMask & 0x00000007) != 0x00000007)
{ {
Int masked = value; mask01 &= channelMask;
c01 &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0]));
masked &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[~bgraWriteMask & 0x7][0]));
c01 |= masked;
} }
*Pointer<Int>(buffer) = (c01 & mask01) | (value & ~mask01);
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;
buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index])); buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = *Pointer<Int>(buffer); value = *Pointer<Int>(buffer);
Int c23 = Extract(As<Int2>(current.x), 1); Int c23 = Extract(As<Int2>(current.x), 1);
Int mask23 = *Pointer<Int>(constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8);
if((bgraWriteMask & 0x00000007) != 0x00000007) if((bgraWriteMask & 0x00000007) != 0x00000007)
{ {
Int masked = value; mask23 &= channelMask;
c23 &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0]));
masked &= *Pointer<Int>(constants + OFFSET(Constants,mask565Q[~bgraWriteMask & 0x7][0]));
c23 |= masked;
} }
*Pointer<Int>(buffer) = (c23 & mask23) | (value & ~mask23);
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;
} }
break; break;
case VK_FORMAT_B8G8R8A8_UNORM: case VK_FORMAT_B8G8R8A8_UNORM:
...@@ -1482,35 +1458,24 @@ namespace sw ...@@ -1482,35 +1458,24 @@ namespace sw
{ {
Pointer<Byte> buffer = cBuffer + x * 4; Pointer<Byte> buffer = cBuffer + x * 4;
Short4 value = *Pointer<Short4>(buffer); 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; mask01 &= channelMask;
c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[bgraWriteMask][0]));
c01 |= masked;
} }
*Pointer<Short4>(buffer) = (c01 & mask01) | (value & ~mask01);
c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD01Q) + xMask * 8);
c01 |= value;
*Pointer<Short4>(buffer) = c01;
buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index])); buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = *Pointer<Short4>(buffer); 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; mask23 &= channelMask;
c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[bgraWriteMask][0]));
masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[bgraWriteMask][0]));
c23 |= masked;
} }
*Pointer<Short4>(buffer) = (c23 & mask23) | (value & ~mask23);
c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
c23 |= value;
*Pointer<Short4>(buffer) = c23;
} }
break; break;
case VK_FORMAT_R8G8B8A8_UNORM: case VK_FORMAT_R8G8B8A8_UNORM:
...@@ -1520,37 +1485,24 @@ namespace sw ...@@ -1520,37 +1485,24 @@ namespace sw
{ {
Pointer<Byte> buffer = cBuffer + x * 4; Pointer<Byte> buffer = cBuffer + x * 4;
Short4 value = *Pointer<Short4>(buffer); 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? Short4 mask01 = *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
if(rgbaWriteMask != 0x0000000F)
if(masked)
{ {
Short4 masked = value; mask01 &= channelMask;
c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[rgbaWriteMask][0]));
masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[rgbaWriteMask][0]));
c01 |= masked;
} }
*Pointer<Short4>(buffer) = (c01 & mask01) | (value & ~mask01);
c01 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD01Q) + xMask * 8);
value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD01Q) + xMask * 8);
c01 |= value;
*Pointer<Short4>(buffer) = c01;
buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index])); buffer += *Pointer<Int>(data + OFFSET(DrawData,colorPitchB[index]));
value = *Pointer<Short4>(buffer); value = *Pointer<Short4>(buffer);
if(masked) Short4 mask23 = *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
if(rgbaWriteMask != 0x0000000F)
{ {
Short4 masked = value; mask23 &= channelMask;
c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskB4Q[rgbaWriteMask][0]));
masked &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskB4Q[rgbaWriteMask][0]));
c23 |= masked;
} }
*Pointer<Short4>(buffer) = (c23 & mask23) | (value & ~mask23);
c23 &= *Pointer<Short4>(constants + OFFSET(Constants,maskD23Q) + xMask * 8);
value &= *Pointer<Short4>(constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
c23 |= value;
*Pointer<Short4>(buffer) = c23;
} }
break; break;
case VK_FORMAT_R8G8_UNORM: case VK_FORMAT_R8G8_UNORM:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment