Commit d61d3a7f by Nicolas Capens

Compute clear colors where they'll be used.

Change-Id: I54ee6018980088d8820e35483f4be7bbf974b7ef Reviewed-on: https://swiftshader-review.googlesource.com/3260Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 5ba566b1
...@@ -2305,28 +2305,6 @@ namespace sw ...@@ -2305,28 +2305,6 @@ namespace sw
// if(lockable || !quadLayoutEnabled) // if(lockable || !quadLayoutEnabled)
{ {
unsigned char r8 = (colorARGB & 0x00FF0000) >> 16;
unsigned char g8 = (colorARGB & 0x0000FF00) >> 8;
unsigned char b8 = (colorARGB & 0x000000FF) >> 0;
unsigned char a8 = (colorARGB & 0xFF000000) >> 24;
unsigned short r16 = (r8 << 8) | r8;
unsigned short g16 = (g8 << 8) | g8;
unsigned short b16 = (b8 << 8) | b8;
unsigned short a16 = (a8 << 8) | a8;
float r32f = r8 / 255.0f;
float g32f = g8 / 255.0f;
float b32f = b8 / 255.0f;
float a32f = a8 / 255.0f;
unsigned char g8r8[4] = {r8, g8, r8, g8};
unsigned short g16r16[2] = {r16, g16};
unsigned char a8b8g8r8[4] = {r8, g8, b8, a8};
unsigned int colorABGR = (unsigned int&)a8b8g8r8;
unsigned int r5g6b5 = (((unsigned short)r8 << 8) & 0xF800) | (((unsigned short)g8 << 3) & 0x07E0) | ((unsigned short)b8 >> 3);
r5g6b5 |= r5g6b5 << 16;
unsigned char *buffer = (unsigned char*)lockInternal(x0, y0, 0, lock, PUBLIC); unsigned char *buffer = (unsigned char*)lockInternal(x0, y0, 0, lock, PUBLIC);
for(int z = 0; z < internal.depth; z++) for(int z = 0; z < internal.depth; z++)
...@@ -2362,6 +2340,14 @@ namespace sw ...@@ -2362,6 +2340,14 @@ namespace sw
break; break;
case FORMAT_X8B8G8R8: case FORMAT_X8B8G8R8:
case FORMAT_A8B8G8R8: case FORMAT_A8B8G8R8:
{
unsigned char r8 = (colorARGB & 0x00FF0000) >> 16;
unsigned char g8 = (colorARGB & 0x0000FF00) >> 8;
unsigned char b8 = (colorARGB & 0x000000FF) >> 0;
unsigned char a8 = (colorARGB & 0xFF000000) >> 24;
unsigned char a8b8g8r8[4] = {r8, g8, b8, a8};
unsigned int colorABGR = (unsigned int&)a8b8g8r8;
if(rgbaMask == 0xF || (internal.format == FORMAT_X8B8G8R8 && rgbaMask == 0x7)) if(rgbaMask == 0xF || (internal.format == FORMAT_X8B8G8R8 && rgbaMask == 0x7))
{ {
memfill4(target, colorABGR, 4 * (x1 - x0)); memfill4(target, colorABGR, 4 * (x1 - x0));
...@@ -2378,8 +2364,14 @@ namespace sw ...@@ -2378,8 +2364,14 @@ namespace sw
target32[x] = maskedColor | (target32[x] & invMask); target32[x] = maskedColor | (target32[x] & invMask);
} }
} }
}
break; break;
case FORMAT_G8R8: case FORMAT_G8R8:
{
unsigned char r8 = (colorARGB & 0x00FF0000) >> 16;
unsigned char g8 = (colorARGB & 0x0000FF00) >> 8;
unsigned char g8r8[4] = {r8, g8, r8, g8};
if((rgbaMask & 0x3) == 0x3) if((rgbaMask & 0x3) == 0x3)
{ {
memfill4(target, (int&)g8r8, 2 * (x1 - x0)); memfill4(target, (int&)g8r8, 2 * (x1 - x0));
...@@ -2396,8 +2388,16 @@ namespace sw ...@@ -2396,8 +2388,16 @@ namespace sw
target16[x] = maskedColor | (target16[x] & invMask); target16[x] = maskedColor | (target16[x] & invMask);
} }
} }
}
break; break;
case FORMAT_G16R16: case FORMAT_G16R16:
{
unsigned char r8 = (colorARGB & 0x00FF0000) >> 16;
unsigned char g8 = (colorARGB & 0x0000FF00) >> 8;
unsigned short r16 = (r8 << 8) | r8;
unsigned short g16 = (g8 << 8) | g8;
unsigned short g16r16[2] = {r16, g16};
if((rgbaMask & 0x3) == 0x3) if((rgbaMask & 0x3) == 0x3)
{ {
memfill4(target, (int&)g16r16, 4 * (x1 - x0)); memfill4(target, (int&)g16r16, 4 * (x1 - x0));
...@@ -2414,8 +2414,19 @@ namespace sw ...@@ -2414,8 +2414,19 @@ namespace sw
target32[x] = maskedColor | (target32[x] & invMask); target32[x] = maskedColor | (target32[x] & invMask);
} }
} }
}
break; break;
case FORMAT_A16B16G16R16: case FORMAT_A16B16G16R16:
{
unsigned char r8 = (colorARGB & 0x00FF0000) >> 16;
unsigned char g8 = (colorARGB & 0x0000FF00) >> 8;
unsigned char b8 = (colorARGB & 0x000000FF) >> 0;
unsigned char a8 = (colorARGB & 0xFF000000) >> 24;
unsigned short r16 = (r8 << 8) | r8;
unsigned short g16 = (g8 << 8) | g8;
unsigned short b16 = (b8 << 8) | b8;
unsigned short a16 = (a8 << 8) | a8;
if(rgbaMask == 0xF) if(rgbaMask == 0xF)
{ {
for(int x = 0; x < width; x++) for(int x = 0; x < width; x++)
...@@ -2433,10 +2444,13 @@ namespace sw ...@@ -2433,10 +2444,13 @@ namespace sw
if(rgbaMask & 0x4) for(int x = 0; x < width; x++) ((unsigned short*)target)[4 * x + 2] = b16; if(rgbaMask & 0x4) for(int x = 0; x < width; x++) ((unsigned short*)target)[4 * x + 2] = b16;
if(rgbaMask & 0x8) for(int x = 0; x < width; x++) ((unsigned short*)target)[4 * x + 3] = a16; if(rgbaMask & 0x8) for(int x = 0; x < width; x++) ((unsigned short*)target)[4 * x + 3] = a16;
} }
}
break; break;
case FORMAT_R32F: case FORMAT_R32F:
if(rgbaMask & 0x1) if(rgbaMask & 0x1)
{ {
float r32f = (float)(colorARGB & 0x00FF0000) / 0x00FF0000;
for(int x = 0; x < width; x++) for(int x = 0; x < width; x++)
{ {
((float*)target)[x] = r32f; ((float*)target)[x] = r32f;
...@@ -2444,6 +2458,10 @@ namespace sw ...@@ -2444,6 +2458,10 @@ namespace sw
} }
break; break;
case FORMAT_G32R32F: case FORMAT_G32R32F:
{
float r32f = (float)(colorARGB & 0x00FF0000) / 0x00FF0000;
float g32f = (float)(colorARGB & 0x0000FF00) / 0x0000FF00;
if((rgbaMask & 0x3) == 0x3) if((rgbaMask & 0x3) == 0x3)
{ {
for(int x = 0; x < width; x++) for(int x = 0; x < width; x++)
...@@ -2457,8 +2475,15 @@ namespace sw ...@@ -2457,8 +2475,15 @@ namespace sw
if(rgbaMask & 0x1) for(int x = 0; x < width; x++) ((float*)target)[2 * x + 0] = r32f; if(rgbaMask & 0x1) for(int x = 0; x < width; x++) ((float*)target)[2 * x + 0] = r32f;
if(rgbaMask & 0x2) for(int x = 0; x < width; x++) ((float*)target)[2 * x + 1] = g32f; if(rgbaMask & 0x2) for(int x = 0; x < width; x++) ((float*)target)[2 * x + 1] = g32f;
} }
}
break; break;
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
{
float r32f = (float)(colorARGB & 0x00FF0000) / 0x00FF0000;
float g32f = (float)(colorARGB & 0x0000FF00) / 0x0000FF00;
float b32f = (float)(colorARGB & 0x000000FF) / 0x000000FF;
float a32f = (float)(colorARGB & 0xFF000000) / 0xFF000000;
if(rgbaMask == 0xF) if(rgbaMask == 0xF)
{ {
for(int x = 0; x < width; x++) for(int x = 0; x < width; x++)
...@@ -2476,11 +2501,16 @@ namespace sw ...@@ -2476,11 +2501,16 @@ namespace sw
if(rgbaMask & 0x4) for(int x = 0; x < width; x++) ((float*)target)[4 * x + 2] = b32f; if(rgbaMask & 0x4) for(int x = 0; x < width; x++) ((float*)target)[4 * x + 2] = b32f;
if(rgbaMask & 0x8) for(int x = 0; x < width; x++) ((float*)target)[4 * x + 3] = a32f; if(rgbaMask & 0x8) for(int x = 0; x < width; x++) ((float*)target)[4 * x + 3] = a32f;
} }
}
break; break;
case FORMAT_R5G6B5: case FORMAT_R5G6B5:
{
unsigned int r5g6b5 = ((colorARGB >> 8) & 0xF800) | ((colorARGB >> 5) & 0x07E0) | ((colorARGB >> 3) & 0x001F);
if((rgbaMask & 0x7) == 0x7) if((rgbaMask & 0x7) == 0x7)
{ {
memfill4(target, r5g6b5, 2 * (x1 - x0)); unsigned int r5g6b5r5g6b5 = r5g6b5 | (r5g6b5 << 16);
memfill4(target, r5g6b5r5g6b5, 2 * (x1 - x0));
} }
else else
{ {
...@@ -2494,6 +2524,7 @@ namespace sw ...@@ -2494,6 +2524,7 @@ namespace sw
target16[x] = maskedColor | (target16[x] & invMask); target16[x] = maskedColor | (target16[x] & invMask);
} }
} }
}
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