Commit d5f0a6ce by Nicolas Capens

Implement R5G6B5 raster operations.

Bug 20891368 Change-Id: I1ca80709b945b4b7f7b82ad7b08d4a6f6d7da9b8 Reviewed-on: https://swiftshader-review.googlesource.com/3254Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent d61d3a7f
...@@ -2129,13 +2129,14 @@ namespace sw ...@@ -2129,13 +2129,14 @@ namespace sw
{ {
case FORMAT_NULL: case FORMAT_NULL:
break; break;
case FORMAT_A16B16G16R16: case FORMAT_R5G6B5:
case FORMAT_A8R8G8B8: case FORMAT_A8R8G8B8:
case FORMAT_A8B8G8R8: case FORMAT_A8B8G8R8:
case FORMAT_X8R8G8B8: case FORMAT_X8R8G8B8:
case FORMAT_X8B8G8R8: case FORMAT_X8B8G8R8:
case FORMAT_A8: case FORMAT_A8:
case FORMAT_G16R16: case FORMAT_G16R16:
case FORMAT_A16B16G16R16:
oC[index].x = Max(oC[index].x, Float4(0.0f)); oC[index].x = Min(oC[index].x, Float4(1.0f)); oC[index].x = Max(oC[index].x, Float4(0.0f)); oC[index].x = Min(oC[index].x, Float4(1.0f));
oC[index].y = Max(oC[index].y, Float4(0.0f)); oC[index].y = Min(oC[index].y, Float4(1.0f)); oC[index].y = Max(oC[index].y, Float4(0.0f)); oC[index].y = Min(oC[index].y, Float4(1.0f));
oC[index].z = Max(oC[index].z, Float4(0.0f)); oC[index].z = Min(oC[index].z, Float4(1.0f)); oC[index].z = Max(oC[index].z, Float4(0.0f)); oC[index].z = Min(oC[index].z, Float4(1.0f));
...@@ -2162,6 +2163,7 @@ namespace sw ...@@ -2162,6 +2163,7 @@ namespace sw
switch(state.targetFormat[0]) switch(state.targetFormat[0])
{ {
case FORMAT_R5G6B5:
case FORMAT_X8R8G8B8: case FORMAT_X8R8G8B8:
case FORMAT_X8B8G8R8: case FORMAT_X8B8G8R8:
case FORMAT_A8R8G8B8: case FORMAT_A8R8G8B8:
...@@ -2181,6 +2183,13 @@ namespace sw ...@@ -2181,6 +2183,13 @@ namespace sw
current.w <<= 4; current.w <<= 4;
} }
if(state.targetFormat[0] == FORMAT_R5G6B5)
{
current.x &= Short4(0xF800u);
current.y &= Short4(0xFC00u);
current.z &= Short4(0xF800u);
}
fogBlend(r, current, fog, r.z[0], r.rhw); fogBlend(r, current, fog, r.z[0], r.rhw);
for(unsigned int q = 0; q < state.multiSample; q++) for(unsigned int q = 0; q < state.multiSample; q++)
...@@ -2241,6 +2250,7 @@ namespace sw ...@@ -2241,6 +2250,7 @@ namespace sw
switch(state.targetFormat[index]) switch(state.targetFormat[index])
{ {
case FORMAT_R5G6B5:
case FORMAT_X8R8G8B8: case FORMAT_X8R8G8B8:
case FORMAT_X8B8G8R8: case FORMAT_X8B8G8R8:
case FORMAT_A8R8G8B8: case FORMAT_A8R8G8B8:
...@@ -2433,6 +2443,17 @@ namespace sw ...@@ -2433,6 +2443,17 @@ namespace sw
// Read pixel // Read pixel
switch(state.targetFormat[index]) switch(state.targetFormat[index])
{ {
case FORMAT_R5G6B5:
buffer = cBuffer + 2 * x;
c01 = As<Short4>(Insert(As<Int2>(c01), *Pointer<Int>(buffer), 0));
buffer += *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index]));
c01 = As<Short4>(Insert(As<Int2>(c01), *Pointer<Int>(buffer), 1));
pixel.x = c01 & Short4(0xF800u);
pixel.y = (c01 & Short4(0x07E0u)) << 5;
pixel.z = (c01 & Short4(0x001Fu)) << 11;
pixel.w = Short4(0xFFFFu);
break;
case FORMAT_A8R8G8B8: case FORMAT_A8R8G8B8:
buffer = cBuffer + 4 * x; buffer = cBuffer + 4 * x;
c01 = *Pointer<Short4>(buffer); c01 = *Pointer<Short4>(buffer);
...@@ -2684,6 +2705,9 @@ namespace sw ...@@ -2684,6 +2705,9 @@ namespace sw
{ {
switch(state.targetFormat[index]) switch(state.targetFormat[index])
{ {
case FORMAT_R5G6B5:
// UNIMPLEMENTED(); // FIXME
break;
case FORMAT_X8G8R8B8Q: case FORMAT_X8G8R8B8Q:
case FORMAT_A8G8R8B8Q: case FORMAT_A8G8R8B8Q:
case FORMAT_X8R8G8B8: case FORMAT_X8R8G8B8:
...@@ -2706,6 +2730,15 @@ namespace sw ...@@ -2706,6 +2730,15 @@ namespace sw
switch(state.targetFormat[index]) switch(state.targetFormat[index])
{ {
case FORMAT_R5G6B5:
{
current.x = current.x & Short4(0xF800u);
current.y = As<UShort4>(current.y & Short4(0xFC00u)) >> 5;
current.z = As<UShort4>(current.z) >> 11;
current.x = current.x | current.y | current.z;
}
break;
case FORMAT_X8G8R8B8Q: case FORMAT_X8G8R8B8Q:
UNIMPLEMENTED(); UNIMPLEMENTED();
// current.x = As<Short4>(As<UShort4>(current.x) >> 8); // current.x = As<Short4>(As<UShort4>(current.x) >> 8);
...@@ -2833,11 +2866,39 @@ namespace sw ...@@ -2833,11 +2866,39 @@ namespace sw
xMask &= sMask; xMask &= sMask;
} }
Pointer<Byte> buffer;
Short4 value;
switch(state.targetFormat[index]) switch(state.targetFormat[index])
{ {
case FORMAT_R5G6B5:
{
Pointer<Byte> buffer = cBuffer + 2 * x;
//Int value = *Pointer<Int>(buffer);
if((rgbaWriteMask & 0x00000007) != 0x00000007)
{
UNIMPLEMENTED();
}
//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);
buffer += *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index]));
//value = *Pointer<Short4>(buffer);
if((rgbaWriteMask & 0x00000007) != 0x00000007)
{
UNIMPLEMENTED();
}
//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);
}
break;
case FORMAT_A8G8R8B8Q: case FORMAT_A8G8R8B8Q:
case FORMAT_X8G8R8B8Q: // FIXME: Don't touch alpha? case FORMAT_X8G8R8B8Q: // FIXME: Don't touch alpha?
UNIMPLEMENTED(); UNIMPLEMENTED();
...@@ -2877,8 +2938,9 @@ namespace sw ...@@ -2877,8 +2938,9 @@ namespace sw
break; break;
case FORMAT_A8R8G8B8: case FORMAT_A8R8G8B8:
case FORMAT_X8R8G8B8: // FIXME: Don't touch alpha? case FORMAT_X8R8G8B8: // FIXME: Don't touch alpha?
buffer = cBuffer + x * 4; {
value = *Pointer<Short4>(buffer); Pointer<Byte> buffer = cBuffer + x * 4;
Short4 value = *Pointer<Short4>(buffer);
if((state.targetFormat[index] == FORMAT_A8R8G8B8 && bgraWriteMask != 0x0000000F) || if((state.targetFormat[index] == FORMAT_A8R8G8B8 && bgraWriteMask != 0x0000000F) ||
((state.targetFormat[index] == FORMAT_X8R8G8B8 && bgraWriteMask != 0x00000007) && ((state.targetFormat[index] == FORMAT_X8R8G8B8 && bgraWriteMask != 0x00000007) &&
...@@ -2912,11 +2974,13 @@ namespace sw ...@@ -2912,11 +2974,13 @@ namespace sw
value &= *Pointer<Short4>(r.constants + OFFSET(Constants,invMaskD23Q) + xMask * 8); value &= *Pointer<Short4>(r.constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
c23 |= value; c23 |= value;
*Pointer<Short4>(buffer) = c23; *Pointer<Short4>(buffer) = c23;
}
break; break;
case FORMAT_A8B8G8R8: case FORMAT_A8B8G8R8:
case FORMAT_X8B8G8R8: // FIXME: Don't touch alpha? case FORMAT_X8B8G8R8: // FIXME: Don't touch alpha?
buffer = cBuffer + x * 4; {
value = *Pointer<Short4>(buffer); Pointer<Byte> buffer = cBuffer + x * 4;
Short4 value = *Pointer<Short4>(buffer);
if((state.targetFormat[index] == FORMAT_A8B8G8R8 && rgbaWriteMask != 0x0000000F) || if((state.targetFormat[index] == FORMAT_A8B8G8R8 && rgbaWriteMask != 0x0000000F) ||
((state.targetFormat[index] == FORMAT_X8B8G8R8 && rgbaWriteMask != 0x00000007) && ((state.targetFormat[index] == FORMAT_X8B8G8R8 && rgbaWriteMask != 0x00000007) &&
...@@ -2950,11 +3014,13 @@ namespace sw ...@@ -2950,11 +3014,13 @@ namespace sw
value &= *Pointer<Short4>(r.constants + OFFSET(Constants,invMaskD23Q) + xMask * 8); value &= *Pointer<Short4>(r.constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
c23 |= value; c23 |= value;
*Pointer<Short4>(buffer) = c23; *Pointer<Short4>(buffer) = c23;
}
break; break;
case FORMAT_A8: case FORMAT_A8:
if(rgbaWriteMask & 0x00000008) if(rgbaWriteMask & 0x00000008)
{ {
buffer = cBuffer + 1 * x; Pointer<Byte> buffer = cBuffer + 1 * x;
Short4 value;
Insert(value, *Pointer<Short>(buffer), 0); Insert(value, *Pointer<Short>(buffer), 0);
Int pitch = *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index])); Int pitch = *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index]));
Insert(value, *Pointer<Short>(buffer + pitch), 1); Insert(value, *Pointer<Short>(buffer + pitch), 1);
...@@ -2969,9 +3035,10 @@ namespace sw ...@@ -2969,9 +3035,10 @@ namespace sw
} }
break; break;
case FORMAT_G16R16: case FORMAT_G16R16:
buffer = cBuffer + 4 * x; {
Pointer<Byte> buffer = cBuffer + 4 * x;
value = *Pointer<Short4>(buffer); Short4 value = *Pointer<Short4>(buffer);
if((rgbaWriteMask & 0x00000003) != 0x00000003) if((rgbaWriteMask & 0x00000003) != 0x00000003)
{ {
...@@ -3002,12 +3069,14 @@ namespace sw ...@@ -3002,12 +3069,14 @@ namespace sw
value &= *Pointer<Short4>(r.constants + OFFSET(Constants,invMaskD23Q) + xMask * 8); value &= *Pointer<Short4>(r.constants + OFFSET(Constants,invMaskD23Q) + xMask * 8);
current.y |= value; current.y |= value;
*Pointer<Short4>(buffer) = current.y; *Pointer<Short4>(buffer) = current.y;
}
break; break;
case FORMAT_A16B16G16R16: case FORMAT_A16B16G16R16:
buffer = cBuffer + 8 * x; {
Pointer<Byte> buffer = cBuffer + 8 * x;
{ {
value = *Pointer<Short4>(buffer); Short4 value = *Pointer<Short4>(buffer);
if(rgbaWriteMask != 0x0000000F) if(rgbaWriteMask != 0x0000000F)
{ {
...@@ -3024,7 +3093,7 @@ namespace sw ...@@ -3024,7 +3093,7 @@ namespace sw
} }
{ {
value = *Pointer<Short4>(buffer + 8); Short4 value = *Pointer<Short4>(buffer + 8);
if(rgbaWriteMask != 0x0000000F) if(rgbaWriteMask != 0x0000000F)
{ {
...@@ -3043,7 +3112,7 @@ namespace sw ...@@ -3043,7 +3112,7 @@ namespace sw
buffer += *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index])); buffer += *Pointer<Int>(r.data + OFFSET(DrawData,colorPitchB[index]));
{ {
value = *Pointer<Short4>(buffer); Short4 value = *Pointer<Short4>(buffer);
if(rgbaWriteMask != 0x0000000F) if(rgbaWriteMask != 0x0000000F)
{ {
...@@ -3060,7 +3129,7 @@ namespace sw ...@@ -3060,7 +3129,7 @@ namespace sw
} }
{ {
value = *Pointer<Short4>(buffer + 8); Short4 value = *Pointer<Short4>(buffer + 8);
if(rgbaWriteMask != 0x0000000F) if(rgbaWriteMask != 0x0000000F)
{ {
...@@ -3075,6 +3144,7 @@ namespace sw ...@@ -3075,6 +3144,7 @@ namespace sw
current.w |= value; current.w |= value;
*Pointer<Short4>(buffer + 8) = current.w; *Pointer<Short4>(buffer + 8) = current.w;
} }
}
break; break;
default: default:
ASSERT(false); ASSERT(false);
......
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