OSDN Git Service

Added FORMAT_X32B32G32R32F as a renderable format
authorAlexis Hetu <sugoi@google.com>
Wed, 13 Apr 2016 15:40:30 +0000 (11:40 -0400)
committerAlexis Hétu <sugoi@google.com>
Thu, 14 Apr 2016 21:01:53 +0000 (21:01 +0000)
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>
src/OpenGL/common/Image.cpp
src/OpenGL/libGLESv2/Framebuffer.cpp
src/OpenGL/libGLESv2/utilities.cpp
src/Renderer/Blitter.cpp
src/Renderer/Surface.cpp
src/Renderer/Surface.hpp
src/Shader/PixelPipeline.cpp
src/Shader/PixelProgram.cpp
src/Shader/PixelRoutine.cpp
src/Shader/SamplerCore.cpp

index cb8c76d..abdd9d4 100644 (file)
@@ -650,6 +650,7 @@ namespace egl
                                return sw::FORMAT_G32R32F;
                        case GL_RGB:
                        case GL_RGB32F:
+                               return sw::FORMAT_X32B32G32R32F;
                        case GL_RGBA:
                        case GL_RGBA32F:
                                return sw::FORMAT_A32B32G32R32F;
index f4c9a76..87e60f4 100644 (file)
@@ -511,6 +511,7 @@ GLenum Framebuffer::getImplementationColorReadFormat()
                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:
@@ -559,6 +560,7 @@ GLenum Framebuffer::getImplementationColorReadType()
                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:
index 9288e2a..79f8f32 100644 (file)
@@ -1590,6 +1590,7 @@ namespace sw2es
                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
@@ -1646,6 +1647,7 @@ namespace sw2es
                        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
@@ -1693,6 +1695,7 @@ namespace sw2es
                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
@@ -1818,6 +1821,7 @@ namespace sw2es
                        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
index 19fcd9c..ee3fc8f 100644 (file)
@@ -271,6 +271,9 @@ namespace sw
                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);
@@ -395,6 +398,13 @@ namespace sw
                                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)
                        {
@@ -903,6 +913,8 @@ namespace sw
                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);
index 334844b..8e5f4fb 100644 (file)
@@ -305,6 +305,8 @@ namespace sw
                        ((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;
@@ -946,6 +948,7 @@ namespace sw
                        r = ((float*)element)[0];
                        g = ((float*)element)[1];
                        break;
+               case FORMAT_X32B32G32R32F:
                case FORMAT_B32G32R32F:
                        r = ((float*)element)[0];
                        g = ((float*)element)[1];
@@ -1569,6 +1572,7 @@ namespace sw
                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;
@@ -2690,6 +2694,7 @@ namespace sw
                        return false;
                case FORMAT_R32F:
                case FORMAT_G32R32F:
+               case FORMAT_X32B32G32R32F:
                case FORMAT_A32B32G32R32F:
                case FORMAT_D32F:
                case FORMAT_D32F_COMPLEMENTARY:
@@ -2774,6 +2779,7 @@ namespace sw
                case FORMAT_G8R8I_SNORM:
                        return component >= 2;
                case FORMAT_A16W16V16U16:
+               case FORMAT_X32B32G32R32F:
                case FORMAT_X8B8G8R8I:
                case FORMAT_X16B16G16R16I:
                case FORMAT_X32B32G32R32I:
@@ -2968,6 +2974,7 @@ namespace sw
                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;
@@ -3591,21 +3598,22 @@ namespace sw
                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:
@@ -5142,7 +5150,7 @@ namespace sw
                                else ASSERT(false);
                        }
                }
-               else if(internal.format == FORMAT_A32B32G32R32F)
+               else if(internal.format == FORMAT_A32B32G32R32F || internal.format == FORMAT_X32B32G32R32F)
                {
                        if(CPUID::supportsSSE())
                        {
index 2d9154d..9e09753 100644 (file)
@@ -157,6 +157,7 @@ namespace sw
                FORMAT_R32F,\r
                FORMAT_G32R32F,\r
                FORMAT_B32G32R32F,\r
+               FORMAT_X32B32G32R32F,\r
                FORMAT_A32B32G32R32F,\r
                // Bump map formats\r
                FORMAT_V8U8,\r
index 99f91e7..8adeed8 100644 (file)
@@ -351,6 +351,7 @@ namespace sw
                        break;
                case FORMAT_R32F:
                case FORMAT_G32R32F:
+               case FORMAT_X32B32G32R32F:
                case FORMAT_A32B32G32R32F:
                        convertSigned12(oC, current);
                        PixelRoutine::fogBlend(oC, fog);
index b005863..b0e47fd 100644 (file)
@@ -615,6 +615,7 @@ namespace sw
                                break;
                        case FORMAT_R32F:
                        case FORMAT_G32R32F:
+                       case FORMAT_X32B32G32R32F:
                        case FORMAT_A32B32G32R32F:
                        case FORMAT_R32I:
                        case FORMAT_G32R32I:
@@ -727,6 +728,7 @@ namespace sw
                                break;
                        case FORMAT_R32F:
                        case FORMAT_G32R32F:
+                       case FORMAT_X32B32G32R32F:
                        case FORMAT_A32B32G32R32F:
                        case FORMAT_R32I:
                        case FORMAT_G32R32I:
index 2b5f087..ca38074 100644 (file)
@@ -2006,6 +2006,7 @@ namespace sw
                        pixel.y = pixel.z;
                        pixel.z = pixel.w = one;
                        break;
+               case FORMAT_X32B32G32R32F:
                case FORMAT_A32B32G32R32F:
                case FORMAT_A32B32G32R32I:
                case FORMAT_A32B32G32R32UI:
@@ -2016,6 +2017,10 @@ namespace sw
                        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);
@@ -2154,6 +2159,7 @@ namespace sw
                        oC.z = UnpackHigh(oC.z, oC.y);
                        oC.y = oC.z;
                        break;
+               case FORMAT_X32B32G32R32F:
                case FORMAT_A32B32G32R32F:
                case FORMAT_A32B32G32R32I:
                case FORMAT_A32B32G32R32UI:
@@ -2257,6 +2263,7 @@ namespace sw
                        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:
@@ -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)
                                {
index 8128617..4f8943a 100644 (file)
@@ -261,6 +261,7 @@ namespace sw
                                        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;
@@ -520,6 +521,7 @@ namespace sw
                                        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;
@@ -2183,6 +2185,7 @@ namespace sw
                case FORMAT_X8L8V8U8:
                case FORMAT_R32F:
                case FORMAT_G32R32F:
+               case FORMAT_X32B32G32R32F:
                case FORMAT_A32B32G32R32F:
                case FORMAT_A8:
                case FORMAT_R8:
@@ -2249,6 +2252,7 @@ namespace sw
                case FORMAT_R5G6B5:
                case FORMAT_R32F:
                case FORMAT_G32R32F:
+               case FORMAT_X32B32G32R32F:
                case FORMAT_A32B32G32R32F:
                case FORMAT_D32F:
                case FORMAT_D32F_LOCKABLE:
@@ -2322,6 +2326,7 @@ namespace sw
                case FORMAT_X8L8V8U8:
                case FORMAT_R32F:
                case FORMAT_G32R32F:
+               case FORMAT_X32B32G32R32F:
                case FORMAT_A32B32G32R32F:
                case FORMAT_A8:
                case FORMAT_R8:
@@ -2396,6 +2401,7 @@ namespace sw
                case FORMAT_X8L8V8U8:
                case FORMAT_R32F:
                case FORMAT_G32R32F:
+               case FORMAT_X32B32G32R32F:
                case FORMAT_A32B32G32R32F:
                case FORMAT_A8:
                case FORMAT_R8:
@@ -2462,6 +2468,7 @@ namespace sw
                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;