Added code to properly render to alphaless floating point formats.
Change-Id: I2e226fb787d8456f61a2946fb9c0d8a9dbb58243
Reviewed-on: https://swiftshader-review.googlesource.com/5128
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
return sw::FORMAT_G32R32F;
case GL_RGB:
case GL_RGB32F:
+ return sw::FORMAT_X32B32G32R32F;
case GL_RGBA:
case GL_RGBA32F:
return sw::FORMAT_A32B32G32R32F;
case sw::FORMAT_X16B16G16R16UI:
case sw::FORMAT_X32B32G32R32I:
case sw::FORMAT_X32B32G32R32UI:return GL_RGB_INTEGER;
+ case sw::FORMAT_X32B32G32R32F:
case sw::FORMAT_B16G16R16F:
case sw::FORMAT_X8B8G8R8I_SNORM:
case sw::FORMAT_X8B8G8R8:
case sw::FORMAT_R32F:
case sw::FORMAT_G32R32F:
case sw::FORMAT_B32G32R32F:
+ case sw::FORMAT_X32B32G32R32F:
case sw::FORMAT_A32B32G32R32F: return GL_FLOAT;
case sw::FORMAT_R8I_SNORM:
case sw::FORMAT_G8R8I_SNORM:
case sw::FORMAT_R32F:\r
case sw::FORMAT_G32R32F:\r
case sw::FORMAT_B32G32R32F:\r
+ case sw::FORMAT_X32B32G32R32F:\r
case sw::FORMAT_A32B32G32R32F:\r
case sw::FORMAT_R32I:\r
case sw::FORMAT_G32R32I:\r
return 16;\r
case sw::FORMAT_G32R32F:\r
case sw::FORMAT_B32G32R32F:\r
+ case sw::FORMAT_X32B32G32R32F:\r
case sw::FORMAT_A32B32G32R32F:\r
case sw::FORMAT_G32R32I:\r
case sw::FORMAT_X32B32G32R32I:\r
case sw::FORMAT_A16B16G16R16UI:\r
return 16;\r
case sw::FORMAT_B32G32R32F:\r
+ case sw::FORMAT_X32B32G32R32F:\r
case sw::FORMAT_A32B32G32R32F:\r
case sw::FORMAT_X32B32G32R32I:\r
case sw::FORMAT_A32B32G32R32I:\r
case sw::FORMAT_R32F:\r
case sw::FORMAT_G32R32F:\r
case sw::FORMAT_B32G32R32F:\r
+ case sw::FORMAT_X32B32G32R32F:\r
case sw::FORMAT_A32B32G32R32F:\r
return GL_FLOAT;\r
case sw::FORMAT_R8:\r
case FORMAT_A32B32G32R32F:
c = *Pointer<Float4>(element);
break;
+ case FORMAT_X32B32G32R32F:
+ case FORMAT_B32G32R32F:
+ c.z = *Pointer<Float>(element + 8);
case FORMAT_G32R32F:
c.x = *Pointer<Float>(element + 0);
c.y = *Pointer<Float>(element + 4);
if(writeA) { *Pointer<Float>(element + 12) = c.w; }
}
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:
if(writeR && writeG)
{
case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI:
case FORMAT_A32B32G32R32F:
+ case FORMAT_X32B32G32R32F:
+ case FORMAT_B32G32R32F:
case FORMAT_G32R32F:
case FORMAT_R32F:
scale = vector(1.0f, 1.0f, 1.0f, 1.0f);
((float*)element)[0] = color.r;
((float*)element)[1] = color.g;
break;
+ case FORMAT_X32B32G32R32F:
+ ((float*)element)[3] = 1.0f;
case FORMAT_B32G32R32F:
((float*)element)[0] = color.r;
((float*)element)[1] = color.g;
r = ((float*)element)[0];
g = ((float*)element)[1];
break;
+ case FORMAT_X32B32G32R32F:
case FORMAT_B32G32R32F:
r = ((float*)element)[0];
g = ((float*)element)[1];
case FORMAT_R32F: return 4;
case FORMAT_G32R32F: return 8;
case FORMAT_B32G32R32F: return 12;
+ case FORMAT_X32B32G32R32F: return 16;
case FORMAT_A32B32G32R32F: return 16;
// Depth/stencil formats
case FORMAT_D16: return 2;
return false;
case FORMAT_R32F:
case FORMAT_G32R32F:
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_D32F:
case FORMAT_D32F_COMPLEMENTARY:
case FORMAT_G8R8I_SNORM:
return component >= 2;
case FORMAT_A16W16V16U16:
+ case FORMAT_X32B32G32R32F:
case FORMAT_X8B8G8R8I:
case FORMAT_X16B16G16R16I:
case FORMAT_X32B32G32R32I:
case FORMAT_Q16W16V16U16: return 4;
case FORMAT_R32F: return 1;
case FORMAT_G32R32F: return 2;
+ case FORMAT_X32B32G32R32F: return 3;
case FORMAT_A32B32G32R32F: return 4;
case FORMAT_D32F: return 1;
case FORMAT_D32F_LOCKABLE: return 1;
case FORMAT_A16F: return FORMAT_A32B32G32R32F;
case FORMAT_R16F: return FORMAT_R32F;
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_A32F: return FORMAT_A32B32G32R32F;
case FORMAT_R32F: return FORMAT_R32F;
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;
// Luminance formats
case FORMAT_L8: return FORMAT_L8;
case FORMAT_A4L4: return FORMAT_A8L8;
case FORMAT_L16: return FORMAT_L16;
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_L32F: return FORMAT_A32B32G32R32F;
+ case FORMAT_L32F: return FORMAT_X32B32G32R32F;
case FORMAT_A32L32F: return FORMAT_A32B32G32R32F;
// Depth/stencil formats
case FORMAT_D16:
else ASSERT(false);
}
}
- else if(internal.format == FORMAT_A32B32G32R32F)
+ else if(internal.format == FORMAT_A32B32G32R32F || internal.format == FORMAT_X32B32G32R32F)
{
if(CPUID::supportsSSE())
{
FORMAT_R32F,\r
FORMAT_G32R32F,\r
FORMAT_B32G32R32F,\r
+ FORMAT_X32B32G32R32F,\r
FORMAT_A32B32G32R32F,\r
// Bump map formats\r
FORMAT_V8U8,\r
break;
case FORMAT_R32F:
case FORMAT_G32R32F:
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
convertSigned12(oC, current);
PixelRoutine::fogBlend(oC, fog);
break;
case FORMAT_R32F:
case FORMAT_G32R32F:
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_R32I:
case FORMAT_G32R32I:
break;
case FORMAT_R32F:
case FORMAT_G32R32F:
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_R32I:
case FORMAT_G32R32I:
pixel.y = pixel.z;
pixel.z = pixel.w = one;
break;
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI:
pixel.z = *Pointer<Float4>(buffer + 16 * x, 16);
pixel.w = *Pointer<Float4>(buffer + 16 * x + 16, 16);
transpose4x4(pixel.x, pixel.y, pixel.z, pixel.w);
+ if(state.targetFormat[index] == FORMAT_X32B32G32R32F)
+ {
+ pixel.w = Float4(1.0f);
+ }
break;
default:
ASSERT(false);
oC.z = UnpackHigh(oC.z, oC.y);
oC.y = oC.z;
break;
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI:
oC.y = As<Float4>(As<Int4>(oC.y) | As<Int4>(value));
*Pointer<Float4>(buffer) = oC.y;
break;
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_A32B32G32R32I:
case FORMAT_A32B32G32R32UI:
}
{
- value = *Pointer<Float4>(buffer + 16, 16);
+ value = (state.targetFormat[index] == FORMAT_X32B32G32R32F) ? Float4(1.0f) : *Pointer<Float4>(buffer + 16, 16);
if(rgbaWriteMask != 0x0000000F)
{
c.y = Short4(0x1000, 0x1000, 0x1000, 0x1000);
case FORMAT_G32R32F:
c.z = Short4(0x1000, 0x1000, 0x1000, 0x1000);
+ case FORMAT_X32B32G32R32F:
c.w = Short4(0x1000, 0x1000, 0x1000, 0x1000);
case FORMAT_A32B32G32R32F:
break;
c.y = Float4(1.0f);
case FORMAT_G32R32F:
c.z = Float4(1.0f);
+ case FORMAT_X32B32G32R32F:
c.w = Float4(1.0f);
case FORMAT_A32B32G32R32F:
break;
case FORMAT_X8L8V8U8:
case FORMAT_R32F:
case FORMAT_G32R32F:
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_A8:
case FORMAT_R8:
case FORMAT_R5G6B5:
case FORMAT_R32F:
case FORMAT_G32R32F:
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_D32F:
case FORMAT_D32F_LOCKABLE:
case FORMAT_X8L8V8U8:
case FORMAT_R32F:
case FORMAT_G32R32F:
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_A8:
case FORMAT_R8:
case FORMAT_X8L8V8U8:
case FORMAT_R32F:
case FORMAT_G32R32F:
+ case FORMAT_X32B32G32R32F:
case FORMAT_A32B32G32R32F:
case FORMAT_A8:
case FORMAT_R8:
case FORMAT_X8L8V8U8: return false;
case FORMAT_R32F: return component < 1;
case FORMAT_G32R32F: return component < 2;
+ case FORMAT_X32B32G32R32F: return component < 3;
case FORMAT_A32B32G32R32F: return component < 3;
case FORMAT_A8: return false;
case FORMAT_R8: return component < 1;