Commit dbd1a8e6 by Alexis Hetu Committed by Alexis Hétu

Added FORMAT_X32B32G32R32F as a renderable format

Added code to properly render to alphaless floating point formats. Change-Id: I2e226fb787d8456f61a2946fb9c0d8a9dbb58243 Reviewed-on: https://swiftshader-review.googlesource.com/5128Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent 69920adf
...@@ -650,6 +650,7 @@ namespace egl ...@@ -650,6 +650,7 @@ namespace egl
return sw::FORMAT_G32R32F; return sw::FORMAT_G32R32F;
case GL_RGB: case GL_RGB:
case GL_RGB32F: case GL_RGB32F:
return sw::FORMAT_X32B32G32R32F;
case GL_RGBA: case GL_RGBA:
case GL_RGBA32F: case GL_RGBA32F:
return sw::FORMAT_A32B32G32R32F; return sw::FORMAT_A32B32G32R32F;
......
...@@ -511,6 +511,7 @@ GLenum Framebuffer::getImplementationColorReadFormat() ...@@ -511,6 +511,7 @@ GLenum Framebuffer::getImplementationColorReadFormat()
case sw::FORMAT_X16B16G16R16UI: case sw::FORMAT_X16B16G16R16UI:
case sw::FORMAT_X32B32G32R32I: case sw::FORMAT_X32B32G32R32I:
case sw::FORMAT_X32B32G32R32UI:return GL_RGB_INTEGER; case sw::FORMAT_X32B32G32R32UI:return GL_RGB_INTEGER;
case sw::FORMAT_X32B32G32R32F:
case sw::FORMAT_B16G16R16F: case sw::FORMAT_B16G16R16F:
case sw::FORMAT_X8B8G8R8I_SNORM: case sw::FORMAT_X8B8G8R8I_SNORM:
case sw::FORMAT_X8B8G8R8: case sw::FORMAT_X8B8G8R8:
...@@ -559,6 +560,7 @@ GLenum Framebuffer::getImplementationColorReadType() ...@@ -559,6 +560,7 @@ GLenum Framebuffer::getImplementationColorReadType()
case sw::FORMAT_R32F: case sw::FORMAT_R32F:
case sw::FORMAT_G32R32F: case sw::FORMAT_G32R32F:
case sw::FORMAT_B32G32R32F: case sw::FORMAT_B32G32R32F:
case sw::FORMAT_X32B32G32R32F:
case sw::FORMAT_A32B32G32R32F: return GL_FLOAT; case sw::FORMAT_A32B32G32R32F: return GL_FLOAT;
case sw::FORMAT_R8I_SNORM: case sw::FORMAT_R8I_SNORM:
case sw::FORMAT_G8R8I_SNORM: case sw::FORMAT_G8R8I_SNORM:
......
...@@ -1590,6 +1590,7 @@ namespace sw2es ...@@ -1590,6 +1590,7 @@ namespace sw2es
case sw::FORMAT_R32F: case sw::FORMAT_R32F:
case sw::FORMAT_G32R32F: case sw::FORMAT_G32R32F:
case sw::FORMAT_B32G32R32F: case sw::FORMAT_B32G32R32F:
case sw::FORMAT_X32B32G32R32F:
case sw::FORMAT_A32B32G32R32F: case sw::FORMAT_A32B32G32R32F:
case sw::FORMAT_R32I: case sw::FORMAT_R32I:
case sw::FORMAT_G32R32I: case sw::FORMAT_G32R32I:
...@@ -1646,6 +1647,7 @@ namespace sw2es ...@@ -1646,6 +1647,7 @@ namespace sw2es
return 16; return 16;
case sw::FORMAT_G32R32F: case sw::FORMAT_G32R32F:
case sw::FORMAT_B32G32R32F: case sw::FORMAT_B32G32R32F:
case sw::FORMAT_X32B32G32R32F:
case sw::FORMAT_A32B32G32R32F: case sw::FORMAT_A32B32G32R32F:
case sw::FORMAT_G32R32I: case sw::FORMAT_G32R32I:
case sw::FORMAT_X32B32G32R32I: case sw::FORMAT_X32B32G32R32I:
...@@ -1693,6 +1695,7 @@ namespace sw2es ...@@ -1693,6 +1695,7 @@ namespace sw2es
case sw::FORMAT_A16B16G16R16UI: case sw::FORMAT_A16B16G16R16UI:
return 16; return 16;
case sw::FORMAT_B32G32R32F: case sw::FORMAT_B32G32R32F:
case sw::FORMAT_X32B32G32R32F:
case sw::FORMAT_A32B32G32R32F: case sw::FORMAT_A32B32G32R32F:
case sw::FORMAT_X32B32G32R32I: case sw::FORMAT_X32B32G32R32I:
case sw::FORMAT_A32B32G32R32I: case sw::FORMAT_A32B32G32R32I:
...@@ -1818,6 +1821,7 @@ namespace sw2es ...@@ -1818,6 +1821,7 @@ namespace sw2es
case sw::FORMAT_R32F: case sw::FORMAT_R32F:
case sw::FORMAT_G32R32F: case sw::FORMAT_G32R32F:
case sw::FORMAT_B32G32R32F: case sw::FORMAT_B32G32R32F:
case sw::FORMAT_X32B32G32R32F:
case sw::FORMAT_A32B32G32R32F: case sw::FORMAT_A32B32G32R32F:
return GL_FLOAT; return GL_FLOAT;
case sw::FORMAT_R8: case sw::FORMAT_R8:
......
...@@ -271,6 +271,9 @@ namespace sw ...@@ -271,6 +271,9 @@ namespace sw
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
c = *Pointer<Float4>(element); c = *Pointer<Float4>(element);
break; break;
case FORMAT_X32B32G32R32F:
case FORMAT_B32G32R32F:
c.z = *Pointer<Float>(element + 8);
case FORMAT_G32R32F: case FORMAT_G32R32F:
c.x = *Pointer<Float>(element + 0); c.x = *Pointer<Float>(element + 0);
c.y = *Pointer<Float>(element + 4); c.y = *Pointer<Float>(element + 4);
...@@ -395,6 +398,13 @@ namespace sw ...@@ -395,6 +398,13 @@ namespace sw
if(writeA) { *Pointer<Float>(element + 12) = c.w; } if(writeA) { *Pointer<Float>(element + 12) = c.w; }
} }
break; break;
case FORMAT_X32B32G32R32F:
if(writeA) { *Pointer<Float>(element + 12) = 1.0f; }
case FORMAT_B32G32R32F:
if(writeR) { *Pointer<Float>(element) = c.x; }
if(writeG) { *Pointer<Float>(element + 4) = c.y; }
if(writeB) { *Pointer<Float>(element + 8) = c.z; }
break;
case FORMAT_G32R32F: case FORMAT_G32R32F:
if(writeR && writeG) if(writeR && writeG)
{ {
...@@ -903,6 +913,8 @@ namespace sw ...@@ -903,6 +913,8 @@ namespace sw
case FORMAT_A32B32G32R32I: case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI: case FORMAT_A32B32G32R32UI:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_B32G32R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_R32F: case FORMAT_R32F:
scale = vector(1.0f, 1.0f, 1.0f, 1.0f); scale = vector(1.0f, 1.0f, 1.0f, 1.0f);
......
...@@ -305,6 +305,8 @@ namespace sw ...@@ -305,6 +305,8 @@ 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_X32B32G32R32F:
((float*)element)[3] = 1.0f;
case FORMAT_B32G32R32F: case FORMAT_B32G32R32F:
((float*)element)[0] = color.r; ((float*)element)[0] = color.r;
((float*)element)[1] = color.g; ((float*)element)[1] = color.g;
...@@ -946,6 +948,7 @@ namespace sw ...@@ -946,6 +948,7 @@ namespace sw
r = ((float*)element)[0]; r = ((float*)element)[0];
g = ((float*)element)[1]; g = ((float*)element)[1];
break; break;
case FORMAT_X32B32G32R32F:
case FORMAT_B32G32R32F: case FORMAT_B32G32R32F:
r = ((float*)element)[0]; r = ((float*)element)[0];
g = ((float*)element)[1]; g = ((float*)element)[1];
...@@ -1569,6 +1572,7 @@ namespace sw ...@@ -1569,6 +1572,7 @@ namespace sw
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_B32G32R32F: return 12;
case FORMAT_X32B32G32R32F: return 16;
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;
...@@ -2690,6 +2694,7 @@ namespace sw ...@@ -2690,6 +2694,7 @@ namespace sw
return false; return false;
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_D32F: case FORMAT_D32F:
case FORMAT_D32F_COMPLEMENTARY: case FORMAT_D32F_COMPLEMENTARY:
...@@ -2774,6 +2779,7 @@ namespace sw ...@@ -2774,6 +2779,7 @@ namespace sw
case FORMAT_G8R8I_SNORM: case FORMAT_G8R8I_SNORM:
return component >= 2; return component >= 2;
case FORMAT_A16W16V16U16: case FORMAT_A16W16V16U16:
case FORMAT_X32B32G32R32F:
case FORMAT_X8B8G8R8I: case FORMAT_X8B8G8R8I:
case FORMAT_X16B16G16R16I: case FORMAT_X16B16G16R16I:
case FORMAT_X32B32G32R32I: case FORMAT_X32B32G32R32I:
...@@ -2968,6 +2974,7 @@ namespace sw ...@@ -2968,6 +2974,7 @@ namespace sw
case FORMAT_Q16W16V16U16: return 4; case FORMAT_Q16W16V16U16: return 4;
case FORMAT_R32F: return 1; case FORMAT_R32F: return 1;
case FORMAT_G32R32F: return 2; case FORMAT_G32R32F: return 2;
case FORMAT_X32B32G32R32F: return 3;
case FORMAT_A32B32G32R32F: return 4; case FORMAT_A32B32G32R32F: return 4;
case FORMAT_D32F: return 1; case FORMAT_D32F: return 1;
case FORMAT_D32F_LOCKABLE: return 1; case FORMAT_D32F_LOCKABLE: return 1;
...@@ -3591,21 +3598,22 @@ namespace sw ...@@ -3591,21 +3598,22 @@ namespace sw
case FORMAT_A16F: return FORMAT_A32B32G32R32F; 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_B16G16R16F: return FORMAT_X32B32G32R32F;
case FORMAT_A16B16G16R16F: return FORMAT_A32B32G32R32F; case FORMAT_A16B16G16R16F: return FORMAT_A32B32G32R32F;
case FORMAT_A32F: 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_B32G32R32F: return FORMAT_X32B32G32R32F;
case FORMAT_X32B32G32R32F: return FORMAT_X32B32G32R32F;
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_L16F: return FORMAT_X32B32G32R32F;
case FORMAT_A16L16F: return FORMAT_A32B32G32R32F; case FORMAT_A16L16F: return FORMAT_A32B32G32R32F;
case FORMAT_L32F: return FORMAT_A32B32G32R32F; case FORMAT_L32F: return FORMAT_X32B32G32R32F;
case FORMAT_A32L32F: return FORMAT_A32B32G32R32F; case FORMAT_A32L32F: return FORMAT_A32B32G32R32F;
// Depth/stencil formats // Depth/stencil formats
case FORMAT_D16: case FORMAT_D16:
...@@ -5142,7 +5150,7 @@ namespace sw ...@@ -5142,7 +5150,7 @@ namespace sw
else ASSERT(false); else ASSERT(false);
} }
} }
else if(internal.format == FORMAT_A32B32G32R32F) else if(internal.format == FORMAT_A32B32G32R32F || internal.format == FORMAT_X32B32G32R32F)
{ {
if(CPUID::supportsSSE()) if(CPUID::supportsSSE())
{ {
......
...@@ -157,6 +157,7 @@ namespace sw ...@@ -157,6 +157,7 @@ namespace sw
FORMAT_R32F, FORMAT_R32F,
FORMAT_G32R32F, FORMAT_G32R32F,
FORMAT_B32G32R32F, FORMAT_B32G32R32F,
FORMAT_X32B32G32R32F,
FORMAT_A32B32G32R32F, FORMAT_A32B32G32R32F,
// Bump map formats // Bump map formats
FORMAT_V8U8, FORMAT_V8U8,
......
...@@ -351,6 +351,7 @@ namespace sw ...@@ -351,6 +351,7 @@ namespace sw
break; break;
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
convertSigned12(oC, current); convertSigned12(oC, current);
PixelRoutine::fogBlend(oC, fog); PixelRoutine::fogBlend(oC, fog);
......
...@@ -615,6 +615,7 @@ namespace sw ...@@ -615,6 +615,7 @@ namespace sw
break; break;
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_R32I: case FORMAT_R32I:
case FORMAT_G32R32I: case FORMAT_G32R32I:
...@@ -727,6 +728,7 @@ namespace sw ...@@ -727,6 +728,7 @@ namespace sw
break; break;
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_R32I: case FORMAT_R32I:
case FORMAT_G32R32I: case FORMAT_G32R32I:
......
...@@ -2006,6 +2006,7 @@ namespace sw ...@@ -2006,6 +2006,7 @@ namespace sw
pixel.y = pixel.z; pixel.y = pixel.z;
pixel.z = pixel.w = one; pixel.z = pixel.w = one;
break; break;
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_A32B32G32R32I: case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI: case FORMAT_A32B32G32R32UI:
...@@ -2016,6 +2017,10 @@ namespace sw ...@@ -2016,6 +2017,10 @@ namespace sw
pixel.z = *Pointer<Float4>(buffer + 16 * x, 16); pixel.z = *Pointer<Float4>(buffer + 16 * x, 16);
pixel.w = *Pointer<Float4>(buffer + 16 * x + 16, 16); pixel.w = *Pointer<Float4>(buffer + 16 * x + 16, 16);
transpose4x4(pixel.x, pixel.y, pixel.z, pixel.w); transpose4x4(pixel.x, pixel.y, pixel.z, pixel.w);
if(state.targetFormat[index] == FORMAT_X32B32G32R32F)
{
pixel.w = Float4(1.0f);
}
break; break;
default: default:
ASSERT(false); ASSERT(false);
...@@ -2154,6 +2159,7 @@ namespace sw ...@@ -2154,6 +2159,7 @@ namespace sw
oC.z = UnpackHigh(oC.z, oC.y); oC.z = UnpackHigh(oC.z, oC.y);
oC.y = oC.z; oC.y = oC.z;
break; break;
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_A32B32G32R32I: case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI: case FORMAT_A32B32G32R32UI:
...@@ -2257,6 +2263,7 @@ namespace sw ...@@ -2257,6 +2263,7 @@ namespace sw
oC.y = As<Float4>(As<Int4>(oC.y) | As<Int4>(value)); oC.y = As<Float4>(As<Int4>(oC.y) | As<Int4>(value));
*Pointer<Float4>(buffer) = oC.y; *Pointer<Float4>(buffer) = oC.y;
break; break;
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_A32B32G32R32I: case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI: case FORMAT_A32B32G32R32UI:
...@@ -2316,7 +2323,7 @@ namespace sw ...@@ -2316,7 +2323,7 @@ namespace sw
} }
{ {
value = *Pointer<Float4>(buffer + 16, 16); value = (state.targetFormat[index] == FORMAT_X32B32G32R32F) ? Float4(1.0f) : *Pointer<Float4>(buffer + 16, 16);
if(rgbaWriteMask != 0x0000000F) if(rgbaWriteMask != 0x0000000F)
{ {
......
...@@ -261,6 +261,7 @@ namespace sw ...@@ -261,6 +261,7 @@ namespace sw
c.y = Short4(0x1000, 0x1000, 0x1000, 0x1000); c.y = Short4(0x1000, 0x1000, 0x1000, 0x1000);
case FORMAT_G32R32F: case FORMAT_G32R32F:
c.z = Short4(0x1000, 0x1000, 0x1000, 0x1000); c.z = Short4(0x1000, 0x1000, 0x1000, 0x1000);
case FORMAT_X32B32G32R32F:
c.w = Short4(0x1000, 0x1000, 0x1000, 0x1000); c.w = Short4(0x1000, 0x1000, 0x1000, 0x1000);
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
break; break;
...@@ -520,6 +521,7 @@ namespace sw ...@@ -520,6 +521,7 @@ namespace sw
c.y = Float4(1.0f); c.y = Float4(1.0f);
case FORMAT_G32R32F: case FORMAT_G32R32F:
c.z = Float4(1.0f); c.z = Float4(1.0f);
case FORMAT_X32B32G32R32F:
c.w = Float4(1.0f); c.w = Float4(1.0f);
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
break; break;
...@@ -2183,6 +2185,7 @@ namespace sw ...@@ -2183,6 +2185,7 @@ namespace sw
case FORMAT_X8L8V8U8: case FORMAT_X8L8V8U8:
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_A8: case FORMAT_A8:
case FORMAT_R8: case FORMAT_R8:
...@@ -2249,6 +2252,7 @@ namespace sw ...@@ -2249,6 +2252,7 @@ namespace sw
case FORMAT_R5G6B5: case FORMAT_R5G6B5:
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_D32F: case FORMAT_D32F:
case FORMAT_D32F_LOCKABLE: case FORMAT_D32F_LOCKABLE:
...@@ -2322,6 +2326,7 @@ namespace sw ...@@ -2322,6 +2326,7 @@ namespace sw
case FORMAT_X8L8V8U8: case FORMAT_X8L8V8U8:
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_A8: case FORMAT_A8:
case FORMAT_R8: case FORMAT_R8:
...@@ -2396,6 +2401,7 @@ namespace sw ...@@ -2396,6 +2401,7 @@ namespace sw
case FORMAT_X8L8V8U8: case FORMAT_X8L8V8U8:
case FORMAT_R32F: case FORMAT_R32F:
case FORMAT_G32R32F: case FORMAT_G32R32F:
case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F: case FORMAT_A32B32G32R32F:
case FORMAT_A8: case FORMAT_A8:
case FORMAT_R8: case FORMAT_R8:
...@@ -2462,6 +2468,7 @@ namespace sw ...@@ -2462,6 +2468,7 @@ namespace sw
case FORMAT_X8L8V8U8: return false; case FORMAT_X8L8V8U8: return false;
case FORMAT_R32F: return component < 1; case FORMAT_R32F: return component < 1;
case FORMAT_G32R32F: return component < 2; case FORMAT_G32R32F: return component < 2;
case FORMAT_X32B32G32R32F: return component < 3;
case FORMAT_A32B32G32R32F: return component < 3; case FORMAT_A32B32G32R32F: return component < 3;
case FORMAT_A8: return false; case FORMAT_A8: return false;
case FORMAT_R8: return component < 1; case FORMAT_R8: return component < 1;
......
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