Commit 8059442d by Nicolas Capens

Add support for OpenGL ES 2.0 image formats to Surface.

Bug 21716622 Change-Id: Ie416118676c984ebdd2f153b35c6f60fa616e4c7 Reviewed-on: https://swiftshader-review.googlesource.com/3443Reviewed-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 3f439242
...@@ -80,12 +80,18 @@ namespace sw ...@@ -80,12 +80,18 @@ namespace sw
case FORMAT_A4R4G4B4: case FORMAT_A4R4G4B4:
*(unsigned short*)element = (unorm<4>(color.a) << 12) | (unorm<4>(color.r) << 8) | (unorm<4>(color.g) << 4) | (unorm<4>(color.b) << 0); *(unsigned short*)element = (unorm<4>(color.a) << 12) | (unorm<4>(color.r) << 8) | (unorm<4>(color.g) << 4) | (unorm<4>(color.b) << 0);
break; break;
case FORMAT_R4G4B4A4:
*(unsigned short*)element = (unorm<4>(color.r) << 12) | (unorm<4>(color.g) << 8) | (unorm<4>(color.b) << 4) | (unorm<4>(color.a) << 0);
break;
case FORMAT_R5G6B5: case FORMAT_R5G6B5:
*(unsigned short*)element = (unorm<5>(color.r) << 11) | (unorm<6>(color.g) << 5) | (unorm<5>(color.b) << 0); *(unsigned short*)element = (unorm<5>(color.r) << 11) | (unorm<6>(color.g) << 5) | (unorm<5>(color.b) << 0);
break; break;
case FORMAT_A1R5G5B5: case FORMAT_A1R5G5B5:
*(unsigned short*)element = (unorm<1>(color.a) << 15) | (unorm<5>(color.r) << 10) | (unorm<5>(color.g) << 5) | (unorm<5>(color.b) << 0); *(unsigned short*)element = (unorm<1>(color.a) << 15) | (unorm<5>(color.r) << 10) | (unorm<5>(color.g) << 5) | (unorm<5>(color.b) << 0);
break; break;
case FORMAT_R5G5B5A1:
*(unsigned short*)element = (unorm<5>(color.r) << 11) | (unorm<5>(color.g) << 6) | (unorm<5>(color.b) << 1) | (unorm<5>(color.a) << 0);
break;
case FORMAT_X1R5G5B5: case FORMAT_X1R5G5B5:
*(unsigned short*)element = 0x8000 | (unorm<5>(color.r) << 10) | (unorm<5>(color.g) << 5) | (unorm<5>(color.b) << 0); *(unsigned short*)element = 0x8000 | (unorm<5>(color.r) << 10) | (unorm<5>(color.g) << 5) | (unorm<5>(color.b) << 0);
break; break;
...@@ -154,19 +160,35 @@ namespace sw ...@@ -154,19 +160,35 @@ namespace sw
((unsigned char*)element)[1] = unorm<8>(color.g); ((unsigned char*)element)[1] = unorm<8>(color.g);
((unsigned char*)element)[2] = unorm<8>(color.r); ((unsigned char*)element)[2] = unorm<8>(color.r);
break; break;
case FORMAT_B8G8R8:
((unsigned char*)element)[0] = unorm<8>(color.r);
((unsigned char*)element)[1] = unorm<8>(color.g);
((unsigned char*)element)[2] = unorm<8>(color.b);
break;
case FORMAT_R16F: case FORMAT_R16F:
*(half*)element = (half)color.r; *(half*)element = (half)color.r;
break; break;
case FORMAT_A16F:
*(half*)element = (half)color.a;
break;
case FORMAT_G16R16F: case FORMAT_G16R16F:
((half*)element)[0] = (half)color.r; ((half*)element)[0] = (half)color.r;
((half*)element)[1] = (half)color.g; ((half*)element)[1] = (half)color.g;
break; break;
case FORMAT_B16G16R16F:
((half*)element)[0] = (half)color.r;
((half*)element)[1] = (half)color.g;
((half*)element)[2] = (half)color.b;
break;
case FORMAT_A16B16G16R16F: case FORMAT_A16B16G16R16F:
((half*)element)[0] = (half)color.r; ((half*)element)[0] = (half)color.r;
((half*)element)[1] = (half)color.g; ((half*)element)[1] = (half)color.g;
((half*)element)[2] = (half)color.b; ((half*)element)[2] = (half)color.b;
((half*)element)[3] = (half)color.a; ((half*)element)[3] = (half)color.a;
break; break;
case FORMAT_A32F:
*(float*)element = color.a;
break;
case FORMAT_R32F: case FORMAT_R32F:
*(float*)element = color.r; *(float*)element = color.r;
break; break;
...@@ -174,6 +196,11 @@ namespace sw ...@@ -174,6 +196,11 @@ namespace sw
((float*)element)[0] = color.r; ((float*)element)[0] = color.r;
((float*)element)[1] = color.g; ((float*)element)[1] = color.g;
break; break;
case FORMAT_B32G32R32F:
((float*)element)[0] = color.r;
((float*)element)[1] = color.g;
((float*)element)[2] = color.b;
break;
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
((float*)element)[0] = color.r; ((float*)element)[0] = color.r;
((float*)element)[1] = color.g; ((float*)element)[1] = color.g;
...@@ -204,6 +231,20 @@ namespace sw ...@@ -204,6 +231,20 @@ namespace sw
case FORMAT_A8L8: case FORMAT_A8L8:
*(unsigned short*)element = (unorm<8>(color.a) << 8) | (unorm<8>(color.r) << 0); *(unsigned short*)element = (unorm<8>(color.a) << 8) | (unorm<8>(color.r) << 0);
break; break;
case FORMAT_L16F:
*(half*)element = (half)color.r;
break;
case FORMAT_A16L16F:
((half*)element)[0] = (half)color.r;
((half*)element)[1] = (half)color.a;
break;
case FORMAT_L32F:
*(float*)element = color.r;
break;
case FORMAT_A32L32F:
((float*)element)[0] = color.r;
((float*)element)[1] = color.a;
break;
default: default:
ASSERT(false); ASSERT(false);
} }
...@@ -303,6 +344,16 @@ namespace sw ...@@ -303,6 +344,16 @@ namespace sw
b = (argb & 0x000F) * (1.0f / 0x000F); b = (argb & 0x000F) * (1.0f / 0x000F);
} }
break; break;
case FORMAT_R4G4B4A4:
{
unsigned short rgba = *(unsigned short*)element;
r = (rgba & 0xF000) * (1.0f / 0xF000);
g = (rgba & 0x0F00) * (1.0f / 0x0F00);
b = (rgba & 0x00F0) * (1.0f / 0x00F0);
a = (rgba & 0x000F) * (1.0f / 0x000F);
}
break;
case FORMAT_R5G6B5: case FORMAT_R5G6B5:
{ {
unsigned short rgb = *(unsigned short*)element; unsigned short rgb = *(unsigned short*)element;
...@@ -322,6 +373,16 @@ namespace sw ...@@ -322,6 +373,16 @@ namespace sw
b = (argb & 0x001F) * (1.0f / 0x001F); b = (argb & 0x001F) * (1.0f / 0x001F);
} }
break; break;
case FORMAT_R5G5B5A1:
{
unsigned short rgba = *(unsigned short*)element;
r = (rgba & 0xF800) * (1.0f / 0xF800);
g = (rgba & 0x07C0) * (1.0f / 0x07C0);
b = (rgba & 0x003E) * (1.0f / 0x003E);
a = (rgba & 0x0001) * (1.0f / 0x0001);
}
break;
case FORMAT_X1R5G5B5: case FORMAT_X1R5G5B5:
{ {
unsigned short xrgb = *(unsigned short*)element; unsigned short xrgb = *(unsigned short*)element;
...@@ -452,6 +513,11 @@ namespace sw ...@@ -452,6 +513,11 @@ namespace sw
g = ((unsigned char*)element)[1] * (1.0f / 0xFF); g = ((unsigned char*)element)[1] * (1.0f / 0xFF);
b = ((unsigned char*)element)[0] * (1.0f / 0xFF); b = ((unsigned char*)element)[0] * (1.0f / 0xFF);
break; break;
case FORMAT_B8G8R8:
r = ((unsigned char*)element)[0] * (1.0f / 0xFF);
g = ((unsigned char*)element)[1] * (1.0f / 0xFF);
b = ((unsigned char*)element)[2] * (1.0f / 0xFF);
break;
case FORMAT_V16U16: case FORMAT_V16U16:
{ {
unsigned int vu = *(unsigned int*)element; unsigned int vu = *(unsigned int*)element;
...@@ -508,6 +574,31 @@ namespace sw ...@@ -508,6 +574,31 @@ namespace sw
b = ((unsigned char*)element)[0] * (1.0f / 0xFF); b = ((unsigned char*)element)[0] * (1.0f / 0xFF);
a = ((unsigned char*)element)[1] * (1.0f / 0xFF); a = ((unsigned char*)element)[1] * (1.0f / 0xFF);
break; break;
case FORMAT_L16F:
r =
g =
b = *(half*)element;
break;
case FORMAT_A16L16F:
r =
g =
b = ((half*)element)[0];
a = ((half*)element)[1];
break;
case FORMAT_L32F:
r =
g =
b = *(float*)element;
break;
case FORMAT_A32L32F:
r =
g =
b = ((float*)element)[0];
a = ((float*)element)[1];
break;
case FORMAT_A16F:
a = *(half*)element;
break;
case FORMAT_R16F: case FORMAT_R16F:
r = *(half*)element; r = *(half*)element;
break; break;
...@@ -515,12 +606,20 @@ namespace sw ...@@ -515,12 +606,20 @@ namespace sw
r = ((half*)element)[0]; r = ((half*)element)[0];
g = ((half*)element)[1]; g = ((half*)element)[1];
break; break;
case FORMAT_B16G16R16F:
r = ((half*)element)[0];
g = ((half*)element)[1];
b = ((half*)element)[2];
break;
case FORMAT_A16B16G16R16F: case FORMAT_A16B16G16R16F:
r = ((half*)element)[0]; r = ((half*)element)[0];
g = ((half*)element)[1]; g = ((half*)element)[1];
b = ((half*)element)[2]; b = ((half*)element)[2];
a = ((half*)element)[3]; a = ((half*)element)[3];
break; break;
case FORMAT_A32F:
a = *(float*)element;
break;
case FORMAT_R32F: case FORMAT_R32F:
r = *(float*)element; r = *(float*)element;
break; break;
...@@ -528,6 +627,11 @@ namespace sw ...@@ -528,6 +627,11 @@ namespace sw
r = ((float*)element)[0]; r = ((float*)element)[0];
g = ((float*)element)[1]; g = ((float*)element)[1];
break; break;
case FORMAT_B32G32R32F:
r = ((float*)element)[0];
g = ((float*)element)[1];
b = ((float*)element)[2];
break;
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
r = ((float*)element)[0]; r = ((float*)element)[0];
g = ((float*)element)[1]; g = ((float*)element)[1];
...@@ -920,9 +1024,12 @@ namespace sw ...@@ -920,9 +1024,12 @@ namespace sw
case FORMAT_R5G6B5: return 2; case FORMAT_R5G6B5: return 2;
case FORMAT_A1R5G5B5: return 2; case FORMAT_A1R5G5B5: return 2;
case FORMAT_X1R5G5B5: return 2; case FORMAT_X1R5G5B5: return 2;
case FORMAT_R5G5B5A1: return 2;
case FORMAT_X4R4G4B4: return 2; case FORMAT_X4R4G4B4: return 2;
case FORMAT_A4R4G4B4: return 2; case FORMAT_A4R4G4B4: return 2;
case FORMAT_R4G4B4A4: return 2;
case FORMAT_R8G8B8: return 3; case FORMAT_R8G8B8: return 3;
case FORMAT_B8G8R8: return 3;
case FORMAT_X8R8G8B8: return 4; case FORMAT_X8R8G8B8: return 4;
// case FORMAT_X8G8R8B8Q: return 4; // case FORMAT_X8G8R8B8Q: return 4;
case FORMAT_A8R8G8B8: return 4; case FORMAT_A8R8G8B8: return 4;
...@@ -957,12 +1064,20 @@ namespace sw ...@@ -957,12 +1064,20 @@ namespace sw
case FORMAT_A4L4: return 1; case FORMAT_A4L4: return 1;
case FORMAT_L16: return 2; case FORMAT_L16: return 2;
case FORMAT_A8L8: return 2; case FORMAT_A8L8: return 2;
case FORMAT_L16F: return 2;
case FORMAT_A16L16F: return 4;
case FORMAT_L32F: return 4;
case FORMAT_A32L32F: return 8;
// Floating-point formats // Floating-point formats
case FORMAT_A16F: return 2;
case FORMAT_R16F: return 2; case FORMAT_R16F: return 2;
case FORMAT_G16R16F: return 4; case FORMAT_G16R16F: return 4;
case FORMAT_B16G16R16F: return 6;
case FORMAT_A16B16G16R16F: return 8; case FORMAT_A16B16G16R16F: return 8;
case FORMAT_A32F: return 4;
case FORMAT_R32F: return 4; case FORMAT_R32F: return 4;
case FORMAT_G32R32F: return 8; case FORMAT_G32R32F: return 8;
case FORMAT_B32G32R32F: return 12;
case FORMAT_A32B32G32R32F: return 16; case FORMAT_A32B32G32R32F: return 16;
// Depth/stencil formats // Depth/stencil formats
case FORMAT_D16: return 2; case FORMAT_D16: return 2;
...@@ -2021,6 +2136,10 @@ namespace sw ...@@ -2021,6 +2136,10 @@ namespace sw
case FORMAT_D32F_LOCKABLE: case FORMAT_D32F_LOCKABLE:
case FORMAT_D32FS8_TEXTURE: case FORMAT_D32FS8_TEXTURE:
case FORMAT_D32FS8_SHADOW: case FORMAT_D32FS8_SHADOW:
case FORMAT_L16F:
case FORMAT_A16L16F:
case FORMAT_L32F:
case FORMAT_A32L32F:
return true; return true;
default: default:
ASSERT(false); ASSERT(false);
...@@ -3079,6 +3198,8 @@ namespace sw ...@@ -3079,6 +3198,8 @@ namespace sw
{ {
return FORMAT_A8G8R8B8Q; return FORMAT_A8G8R8B8Q;
} }
case FORMAT_R5G5B5A1:
case FORMAT_R4G4B4A4:
case FORMAT_A8B8G8R8: case FORMAT_A8B8G8R8:
return FORMAT_A8B8G8R8; return FORMAT_A8B8G8R8;
case FORMAT_R3G3B2: case FORMAT_R3G3B2:
...@@ -3095,6 +3216,7 @@ namespace sw ...@@ -3095,6 +3216,7 @@ namespace sw
{ {
return FORMAT_X8G8R8B8Q; return FORMAT_X8G8R8B8Q;
} }
case FORMAT_B8G8R8:
case FORMAT_X8B8G8R8: case FORMAT_X8B8G8R8:
return FORMAT_X8B8G8R8; return FORMAT_X8B8G8R8;
// Compressed formats // Compressed formats
...@@ -3119,17 +3241,25 @@ namespace sw ...@@ -3119,17 +3241,25 @@ namespace sw
case FORMAT_A2W10V10U10: return FORMAT_A16W16V16U16; case FORMAT_A2W10V10U10: return FORMAT_A16W16V16U16;
case FORMAT_Q16W16V16U16: return FORMAT_Q16W16V16U16; case FORMAT_Q16W16V16U16: return FORMAT_Q16W16V16U16;
// Floating-point formats // Floating-point formats
case FORMAT_A16F: return FORMAT_A32B32G32R32F;
case FORMAT_R16F: return FORMAT_R32F; case FORMAT_R16F: return FORMAT_R32F;
case FORMAT_G16R16F: return FORMAT_G32R32F; case FORMAT_G16R16F: return FORMAT_G32R32F;
case FORMAT_B16G16R16F: return FORMAT_A32B32G32R32F;
case FORMAT_A16B16G16R16F: return FORMAT_A32B32G32R32F; case FORMAT_A16B16G16R16F: return FORMAT_A32B32G32R32F;
case FORMAT_A32F: return FORMAT_A32B32G32R32F;
case FORMAT_R32F: return FORMAT_R32F; case FORMAT_R32F: return FORMAT_R32F;
case FORMAT_G32R32F: return FORMAT_G32R32F; case FORMAT_G32R32F: return FORMAT_G32R32F;
case FORMAT_B32G32R32F: return FORMAT_A32B32G32R32F;
case FORMAT_A32B32G32R32F: return FORMAT_A32B32G32R32F; case FORMAT_A32B32G32R32F: return FORMAT_A32B32G32R32F;
// Luminance formats // Luminance formats
case FORMAT_L8: return FORMAT_L8; case FORMAT_L8: return FORMAT_L8;
case FORMAT_A4L4: return FORMAT_A8L8; case FORMAT_A4L4: return FORMAT_A8L8;
case FORMAT_L16: return FORMAT_L16; case FORMAT_L16: return FORMAT_L16;
case FORMAT_A8L8: return FORMAT_A8L8; case FORMAT_A8L8: return FORMAT_A8L8;
case FORMAT_L16F: return FORMAT_A32B32G32R32F;
case FORMAT_A16L16F: return FORMAT_A32B32G32R32F;
case FORMAT_L32F: return FORMAT_A32B32G32R32F;
case FORMAT_A32L32F: return FORMAT_A32B32G32R32F;
// Depth/stencil formats // Depth/stencil formats
case FORMAT_D16: case FORMAT_D16:
case FORMAT_D32: case FORMAT_D32:
......
...@@ -52,14 +52,17 @@ namespace sw ...@@ -52,14 +52,17 @@ namespace sw
FORMAT_A8R3G3B2, FORMAT_A8R3G3B2,
FORMAT_X4R4G4B4, FORMAT_X4R4G4B4,
FORMAT_A4R4G4B4, FORMAT_A4R4G4B4,
FORMAT_R4G4B4A4,
FORMAT_R5G6B5, FORMAT_R5G6B5,
FORMAT_R8G8B8, FORMAT_R8G8B8,
FORMAT_B8G8R8,
FORMAT_X8R8G8B8, FORMAT_X8R8G8B8,
FORMAT_A8R8G8B8, FORMAT_A8R8G8B8,
FORMAT_X8B8G8R8, FORMAT_X8B8G8R8,
FORMAT_A8B8G8R8, FORMAT_A8B8G8R8,
FORMAT_X1R5G5B5, FORMAT_X1R5G5B5,
FORMAT_A1R5G5B5, FORMAT_A1R5G5B5,
FORMAT_R5G5B5A1,
FORMAT_G8R8, FORMAT_G8R8,
FORMAT_G16R16, FORMAT_G16R16,
FORMAT_A2R10G10B10, FORMAT_A2R10G10B10,
...@@ -76,11 +79,15 @@ namespace sw ...@@ -76,11 +79,15 @@ namespace sw
FORMAT_ATI2, FORMAT_ATI2,
FORMAT_ETC1, FORMAT_ETC1,
// Floating-point formats // Floating-point formats
FORMAT_A16F,
FORMAT_R16F, FORMAT_R16F,
FORMAT_G16R16F, FORMAT_G16R16F,
FORMAT_B16G16R16F,
FORMAT_A16B16G16R16F, FORMAT_A16B16G16R16F,
FORMAT_A32F,
FORMAT_R32F, FORMAT_R32F,
FORMAT_G32R32F, FORMAT_G32R32F,
FORMAT_B32G32R32F,
FORMAT_A32B32G32R32F, FORMAT_A32B32G32R32F,
// Bump map formats // Bump map formats
FORMAT_V8U8, FORMAT_V8U8,
...@@ -96,6 +103,10 @@ namespace sw ...@@ -96,6 +103,10 @@ namespace sw
FORMAT_A4L4, FORMAT_A4L4,
FORMAT_L16, FORMAT_L16,
FORMAT_A8L8, FORMAT_A8L8,
FORMAT_L16F,
FORMAT_A16L16F,
FORMAT_L32F,
FORMAT_A32L32F,
// Depth/stencil formats // Depth/stencil formats
FORMAT_D16, FORMAT_D16,
FORMAT_D32, FORMAT_D32,
......
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