Implement R5G6B5 write masking. Bug 20891368 Change-Id: Ie4e153330c0a422c849953caf02b199df860b8f0 Reviewed-on: https://swiftshader-review.googlesource.com/3256 Reviewed-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com> Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/PixelRoutine.cpp b/src/Shader/PixelRoutine.cpp index e1a5fb6..dded202 100644 --- a/src/Shader/PixelRoutine.cpp +++ b/src/Shader/PixelRoutine.cpp
@@ -2871,32 +2871,40 @@ case FORMAT_R5G6B5: { Pointer<Byte> buffer = cBuffer + 2 * x; + Int value = *Pointer<Int>(buffer); - //Int value = *Pointer<Int>(buffer); + Int c01 = Extract(As<Int2>(current.x), 0); - if((rgbaWriteMask & 0x00000007) != 0x00000007) + if((bgraWriteMask & 0x00000007) != 0x00000007) { - UNIMPLEMENTED(); + Int masked = value; + c01 &= *Pointer<Int>(r.constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0])); + masked &= *Pointer<Int>(r.constants + OFFSET(Constants,invMask565Q[bgraWriteMask & 0x7][0])); + c01 |= masked; } - //current.x &= *Pointer<Short4>(r.constants + OFFSET(Constants,maskD01Q) + xMask * 8); - //value &= *Pointer<Short4>(r.constants + OFFSET(Constants,invMaskD01Q) + xMask * 8); - //current.x |= value; - *Pointer<Int>(buffer) = Extract(As<Int2>(current.x), 0); + c01 &= *Pointer<Int>(r.constants + OFFSET(Constants,maskW4Q[0][0]) + xMask * 8); + value &= *Pointer<Int>(r.constants + OFFSET(Constants,invMaskW4Q[0][0]) + xMask * 8); + c01 |= value; + *Pointer<Int>(buffer) = c01; buffer += *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index])); + value = *Pointer<Int>(buffer); - //value = *Pointer<Short4>(buffer); + Int c23 = Extract(As<Int2>(current.x), 1); - if((rgbaWriteMask & 0x00000007) != 0x00000007) + if((bgraWriteMask & 0x00000007) != 0x00000007) { - UNIMPLEMENTED(); + Int masked = value; + c23 &= *Pointer<Int>(r.constants + OFFSET(Constants,mask565Q[bgraWriteMask & 0x7][0])); + masked &= *Pointer<Int>(r.constants + OFFSET(Constants,invMask565Q[bgraWriteMask & 0x7][0])); + c23 |= masked; } - //current.y &= *Pointer<Short4>(r.constants + OFFSET(Constants,maskD23Q) + xMask * 8); - //value &= *Pointer<Short4>(r.constants + OFFSET(Constants,invMaskD23Q) + xMask * 8); - //current.y |= value; - *Pointer<Int>(buffer) = Extract(As<Int2>(current.x), 1); + c23 &= *Pointer<Int>(r.constants + OFFSET(Constants,maskW4Q[0][2]) + xMask * 8); + value &= *Pointer<Int>(r.constants + OFFSET(Constants,invMaskW4Q[0][2]) + xMask * 8); + c23 |= value; + *Pointer<Int>(buffer) = c23; } break; case FORMAT_A8G8R8B8Q: