OSDN Git Service

Fix not returning GL_BGRA_EXT for incompatible format types.
authorNicolas Capens <capn@google.com>
Mon, 27 Mar 2017 20:15:20 +0000 (16:15 -0400)
committerNicolas Capens <capn@google.com>
Wed, 29 Mar 2017 01:29:50 +0000 (01:29 +0000)
The EXT_read_format_bgra extension specifies that GL_BGRA_EXT can only be
returned for GL_UNSIGNED_BYTE, UNSIGNED_SHORT_4_4_4_4_REV_EXT, and
UNSIGNED_SHORT_1_5_5_5_REV_EXT types.

Bug swiftshader:38

Change-Id: I54d7b6bbb0954fce87ee7622207fe32a308a43d9
Reviewed-on: https://swiftshader-review.googlesource.com/9030
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLES_CM/Framebuffer.cpp
src/OpenGL/libGLESv2/Framebuffer.cpp

index 5dfa67c..933aa2a 100644 (file)
@@ -405,15 +405,14 @@ GLenum Framebuffer::getImplementationColorReadFormat()
 
        if(colorbuffer)
        {
-               // Don't return GL_RGBA since that's always supported. Provide a second option here.
                switch(colorbuffer->getInternalFormat())
                {
-               case sw::FORMAT_A8R8G8B8:      return GL_BGRA_EXT;
-               case sw::FORMAT_A8B8G8R8:      return GL_BGRA_EXT;
-               case sw::FORMAT_X8R8G8B8:      return 0x80E0;   // GL_BGR_EXT
-               case sw::FORMAT_X8B8G8R8:      return 0x80E0;   // GL_BGR_EXT
-               case sw::FORMAT_A1R5G5B5:      return GL_BGRA_EXT;
-               case sw::FORMAT_R5G6B5:        return 0x80E0;   // GL_BGR_EXT
+               case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT;
+               case sw::FORMAT_A8B8G8R8: return GL_RGBA;
+               case sw::FORMAT_X8R8G8B8: return GL_BGRA_EXT;
+               case sw::FORMAT_X8B8G8R8: return GL_RGBA;
+               case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT;
+               case sw::FORMAT_R5G6B5:   return GL_RGB;
                default:
                        UNREACHABLE(colorbuffer->getInternalFormat());
                }
@@ -430,12 +429,12 @@ GLenum Framebuffer::getImplementationColorReadType()
        {
                switch(colorbuffer->getInternalFormat())
                {
-               case sw::FORMAT_A8R8G8B8:      return GL_UNSIGNED_BYTE;
-               case sw::FORMAT_A8B8G8R8:      return GL_UNSIGNED_BYTE;
-               case sw::FORMAT_X8R8G8B8:      return GL_UNSIGNED_BYTE;
-               case sw::FORMAT_X8B8G8R8:      return GL_UNSIGNED_BYTE;
-               case sw::FORMAT_A1R5G5B5:      return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
-               case sw::FORMAT_R5G6B5:        return GL_UNSIGNED_SHORT_5_6_5;
+               case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_A8B8G8R8: return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_X8B8G8R8: return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_A1R5G5B5: return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
+               case sw::FORMAT_R5G6B5:   return GL_UNSIGNED_SHORT_5_6_5;
                default:
                        UNREACHABLE(colorbuffer->getInternalFormat());
                }
index 8b1eda5..6227577 100644 (file)
@@ -497,56 +497,55 @@ GLenum Framebuffer::getImplementationColorReadFormat() const
 
        if(colorbuffer)
        {
-               // Don't return GL_RGBA since that's always supported. Provide a second option here.
                switch(colorbuffer->getInternalFormat())
                {
-               case sw::FORMAT_A8B8G8R8I:
-               case sw::FORMAT_A8B8G8R8UI:
-               case sw::FORMAT_A16B16G16R16I:
-               case sw::FORMAT_A16B16G16R16UI:
-               case sw::FORMAT_A32B32G32R32I:
-               case sw::FORMAT_A32B32G32R32UI:return GL_RGBA_INTEGER;
-               case sw::FORMAT_A2B10G10R10:   return GL_RGB10_A2;
-               case sw::FORMAT_A8B8G8R8I_SNORM:
-               case sw::FORMAT_A16B16G16R16F:
-               case sw::FORMAT_A32B32G32R32F:
-               case sw::FORMAT_A8R8G8B8:
-               case sw::FORMAT_A8B8G8R8:
-               case sw::FORMAT_SRGB8_A8:
-               case sw::FORMAT_A1R5G5B5:      return GL_BGRA_EXT;
-               case sw::FORMAT_X8B8G8R8I:
-               case sw::FORMAT_X8B8G8R8UI:
-               case sw::FORMAT_X16B16G16R16I:
-               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_SRGB8_X8:
-               case sw::FORMAT_X8B8G8R8:      return GL_RGB;
-               case sw::FORMAT_X8R8G8B8:      return 0x80E0;   // GL_BGR_EXT
-               case sw::FORMAT_R5G6B5:        return GL_RGB;
-               case sw::FORMAT_G8R8I:
-               case sw::FORMAT_G8R8UI:
-               case sw::FORMAT_G16R16I:
-               case sw::FORMAT_G16R16UI:
-               case sw::FORMAT_G32R32I:
-               case sw::FORMAT_G32R32UI:      return GL_RG_INTEGER;
-               case sw::FORMAT_G8R8:
-               case sw::FORMAT_G8R8I_SNORM:
-               case sw::FORMAT_G16R16F:
-               case sw::FORMAT_G32R32F:       return GL_RG;
-               case sw::FORMAT_R8I:
-               case sw::FORMAT_R8UI:
-               case sw::FORMAT_R16I:
-               case sw::FORMAT_R16UI:
-               case sw::FORMAT_R32I:
-               case sw::FORMAT_R32UI:         return GL_RED_INTEGER;
-               case sw::FORMAT_R8:
-               case sw::FORMAT_R8I_SNORM:
-               case sw::FORMAT_R16F:
-               case sw::FORMAT_R32F:          return GL_RED;
+               case sw::FORMAT_A8B8G8R8I:       return GL_RGBA_INTEGER;
+               case sw::FORMAT_A8B8G8R8UI:      return GL_RGBA_INTEGER;
+               case sw::FORMAT_A16B16G16R16I:   return GL_RGBA_INTEGER;
+               case sw::FORMAT_A16B16G16R16UI:  return GL_RGBA_INTEGER;
+               case sw::FORMAT_A32B32G32R32I:   return GL_RGBA_INTEGER;
+               case sw::FORMAT_A32B32G32R32UI:  return GL_RGBA_INTEGER;
+               case sw::FORMAT_A2B10G10R10:     return GL_RGB10_A2;
+               case sw::FORMAT_A8B8G8R8I_SNORM: return GL_RGBA;
+               case sw::FORMAT_A8B8G8R8:        return GL_RGBA;
+               case sw::FORMAT_SRGB8_A8:        return GL_RGBA;
+               case sw::FORMAT_A8R8G8B8:        return GL_BGRA_EXT;
+               case sw::FORMAT_A1R5G5B5:        return GL_BGRA_EXT;
+               case sw::FORMAT_X8B8G8R8I:       return GL_RGBA_INTEGER;
+               case sw::FORMAT_X8B8G8R8UI:      return GL_RGBA_INTEGER;
+               case sw::FORMAT_X16B16G16R16I:   return GL_RGBA_INTEGER;
+               case sw::FORMAT_X16B16G16R16UI:  return GL_RGBA_INTEGER;
+               case sw::FORMAT_X32B32G32R32I:   return GL_RGBA_INTEGER;
+               case sw::FORMAT_X32B32G32R32UI:  return GL_RGBA_INTEGER;
+               case sw::FORMAT_X8B8G8R8I_SNORM: return GL_RGBA;
+               case sw::FORMAT_SRGB8_X8:        return GL_RGBA;
+               case sw::FORMAT_X8B8G8R8:        return GL_RGBA;
+               case sw::FORMAT_X8R8G8B8:        return GL_BGRA_EXT;
+               case sw::FORMAT_R5G6B5:          return GL_RGB;
+               case sw::FORMAT_G8R8I:           return GL_RG_INTEGER;
+               case sw::FORMAT_G8R8UI:          return GL_RG_INTEGER;
+               case sw::FORMAT_G16R16I:         return GL_RG_INTEGER;
+               case sw::FORMAT_G16R16UI:        return GL_RG_INTEGER;
+               case sw::FORMAT_G32R32I:         return GL_RG_INTEGER;
+               case sw::FORMAT_G32R32UI:        return GL_RG_INTEGER;
+               case sw::FORMAT_R8I:             return GL_RED_INTEGER;
+               case sw::FORMAT_R8UI:            return GL_RED_INTEGER;
+               case sw::FORMAT_R16I:            return GL_RED_INTEGER;
+               case sw::FORMAT_R16UI:           return GL_RED_INTEGER;
+               case sw::FORMAT_R32I:            return GL_RED_INTEGER;
+               case sw::FORMAT_R32UI:           return GL_RED_INTEGER;
+               case sw::FORMAT_R8:              return GL_RED;
+               case sw::FORMAT_R8I_SNORM:       return GL_RED;
+               case sw::FORMAT_R16F:            return GL_RED;
+               case sw::FORMAT_R32F:            return GL_RED;
+               case sw::FORMAT_G8R8:            return GL_RG;
+               case sw::FORMAT_G8R8I_SNORM:     return GL_RG;
+               case sw::FORMAT_G16R16F:         return GL_RG;
+               case sw::FORMAT_G32R32F:         return GL_RG;
+               case sw::FORMAT_B16G16R16F:      return GL_RGB;
+               case sw::FORMAT_X32B32G32R32F:   return GL_RGBA;
+               case sw::FORMAT_A16B16G16R16F:   return GL_RGBA;
+               case sw::FORMAT_A32B32G32R32F:   return GL_RGBA;
                default:
                        UNREACHABLE(colorbuffer->getInternalFormat());
                }
@@ -563,54 +562,54 @@ GLenum Framebuffer::getImplementationColorReadType() const
        {
                switch(colorbuffer->getInternalFormat())
                {
-               case sw::FORMAT_R16F:
-               case sw::FORMAT_G16R16F:
-               case sw::FORMAT_B16G16R16F:
-               case sw::FORMAT_A16B16G16R16F:
-               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_X8B8G8R8I_SNORM:
-               case sw::FORMAT_A8B8G8R8I_SNORM:return GL_BYTE;
-               case sw::FORMAT_R8:
-               case sw::FORMAT_G8R8:
-               case sw::FORMAT_SRGB8_X8:
-               case sw::FORMAT_SRGB8_A8:
-               case sw::FORMAT_A8R8G8B8:
-               case sw::FORMAT_A8B8G8R8:
-               case sw::FORMAT_X8R8G8B8:
-               case sw::FORMAT_X8B8G8R8:      return GL_UNSIGNED_BYTE;
-               case sw::FORMAT_R8I:
-               case sw::FORMAT_G8R8I:
-               case sw::FORMAT_X8B8G8R8I:
-               case sw::FORMAT_A8B8G8R8I:
-               case sw::FORMAT_R16I:
-               case sw::FORMAT_G16R16I:
-               case sw::FORMAT_X16B16G16R16I:
-               case sw::FORMAT_A16B16G16R16I:
-               case sw::FORMAT_R32I:
-               case sw::FORMAT_G32R32I:
-               case sw::FORMAT_X32B32G32R32I:
-               case sw::FORMAT_A32B32G32R32I: return GL_INT;
-               case sw::FORMAT_R8UI:
-               case sw::FORMAT_G8R8UI:
-               case sw::FORMAT_X8B8G8R8UI:
-               case sw::FORMAT_A8B8G8R8UI:
-               case sw::FORMAT_R16UI:
-               case sw::FORMAT_G16R16UI:
-               case sw::FORMAT_X16B16G16R16UI:
-               case sw::FORMAT_A16B16G16R16UI:
-               case sw::FORMAT_R32UI:
-               case sw::FORMAT_G32R32UI:
-               case sw::FORMAT_X32B32G32R32UI:
-               case sw::FORMAT_A32B32G32R32UI:return GL_UNSIGNED_INT;
-               case sw::FORMAT_A2B10G10R10:   return GL_UNSIGNED_INT_10_10_10_2_OES;
-               case sw::FORMAT_A1R5G5B5:      return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
-               case sw::FORMAT_R5G6B5:        return GL_UNSIGNED_SHORT_5_6_5;
+               case sw::FORMAT_R16F:            return GL_FLOAT;
+               case sw::FORMAT_G16R16F:         return GL_FLOAT;
+               case sw::FORMAT_B16G16R16F:      return GL_FLOAT;
+               case sw::FORMAT_A16B16G16R16F:   return GL_FLOAT;
+               case sw::FORMAT_R32F:            return GL_FLOAT;
+               case sw::FORMAT_G32R32F:         return GL_FLOAT;
+               case sw::FORMAT_B32G32R32F:      return GL_FLOAT;
+               case sw::FORMAT_X32B32G32R32F:   return GL_FLOAT;
+               case sw::FORMAT_A32B32G32R32F:   return GL_FLOAT;
+               case sw::FORMAT_R8I_SNORM:       return GL_BYTE;
+               case sw::FORMAT_G8R8I_SNORM:     return GL_BYTE;
+               case sw::FORMAT_X8B8G8R8I_SNORM: return GL_BYTE;
+               case sw::FORMAT_A8B8G8R8I_SNORM: return GL_BYTE;
+               case sw::FORMAT_R8:              return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_G8R8:            return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_SRGB8_X8:        return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_SRGB8_A8:        return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_A8R8G8B8:        return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_A8B8G8R8:        return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_X8R8G8B8:        return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_X8B8G8R8:        return GL_UNSIGNED_BYTE;
+               case sw::FORMAT_R8I:             return GL_INT;
+               case sw::FORMAT_G8R8I:           return GL_INT;
+               case sw::FORMAT_X8B8G8R8I:       return GL_INT;
+               case sw::FORMAT_A8B8G8R8I:       return GL_INT;
+               case sw::FORMAT_R16I:            return GL_INT;
+               case sw::FORMAT_G16R16I:         return GL_INT;
+               case sw::FORMAT_X16B16G16R16I:   return GL_INT;
+               case sw::FORMAT_A16B16G16R16I:   return GL_INT;
+               case sw::FORMAT_R32I:            return GL_INT;
+               case sw::FORMAT_G32R32I:         return GL_INT;
+               case sw::FORMAT_X32B32G32R32I:   return GL_INT;
+               case sw::FORMAT_A32B32G32R32I:   return GL_INT;
+               case sw::FORMAT_R8UI:            return GL_UNSIGNED_INT;
+               case sw::FORMAT_G8R8UI:          return GL_UNSIGNED_INT;
+               case sw::FORMAT_X8B8G8R8UI:      return GL_UNSIGNED_INT;
+               case sw::FORMAT_A8B8G8R8UI:      return GL_UNSIGNED_INT;
+               case sw::FORMAT_R16UI:           return GL_UNSIGNED_INT;
+               case sw::FORMAT_G16R16UI:        return GL_UNSIGNED_INT;
+               case sw::FORMAT_X16B16G16R16UI:  return GL_UNSIGNED_INT;
+               case sw::FORMAT_A16B16G16R16UI:  return GL_UNSIGNED_INT;
+               case sw::FORMAT_R32UI:           return GL_UNSIGNED_INT;
+               case sw::FORMAT_G32R32UI:        return GL_UNSIGNED_INT;
+               case sw::FORMAT_X32B32G32R32UI:  return GL_UNSIGNED_INT;
+               case sw::FORMAT_A32B32G32R32UI:  return GL_UNSIGNED_INT;
+               case sw::FORMAT_A2B10G10R10:     return GL_UNSIGNED_INT_10_10_10_2_OES;
+               case sw::FORMAT_A1R5G5B5:        return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
+               case sw::FORMAT_R5G6B5:          return GL_UNSIGNED_SHORT_5_6_5;
                default:
                        UNREACHABLE(colorbuffer->getInternalFormat());
                }