Commit dba3e303 by Nicolas Capens

Fix not returning GL_BGRA_EXT for incompatible format types.

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/9030Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent ce28546b
...@@ -405,15 +405,14 @@ GLenum Framebuffer::getImplementationColorReadFormat() ...@@ -405,15 +405,14 @@ GLenum Framebuffer::getImplementationColorReadFormat()
if(colorbuffer) if(colorbuffer)
{ {
// Don't return GL_RGBA since that's always supported. Provide a second option here.
switch(colorbuffer->getInternalFormat()) switch(colorbuffer->getInternalFormat())
{ {
case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT; case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_A8B8G8R8: return GL_BGRA_EXT; case sw::FORMAT_A8B8G8R8: return GL_RGBA;
case sw::FORMAT_X8R8G8B8: return 0x80E0; // GL_BGR_EXT case sw::FORMAT_X8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_X8B8G8R8: return 0x80E0; // GL_BGR_EXT case sw::FORMAT_X8B8G8R8: return GL_RGBA;
case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT; case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT;
case sw::FORMAT_R5G6B5: return 0x80E0; // GL_BGR_EXT case sw::FORMAT_R5G6B5: return GL_RGB;
default: default:
UNREACHABLE(colorbuffer->getInternalFormat()); UNREACHABLE(colorbuffer->getInternalFormat());
} }
...@@ -430,12 +429,12 @@ GLenum Framebuffer::getImplementationColorReadType() ...@@ -430,12 +429,12 @@ GLenum Framebuffer::getImplementationColorReadType()
{ {
switch(colorbuffer->getInternalFormat()) switch(colorbuffer->getInternalFormat())
{ {
case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE; case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A8B8G8R8: return GL_UNSIGNED_BYTE; case sw::FORMAT_A8B8G8R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE; case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8B8G8R8: 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_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_R5G6B5: return GL_UNSIGNED_SHORT_5_6_5;
default: default:
UNREACHABLE(colorbuffer->getInternalFormat()); UNREACHABLE(colorbuffer->getInternalFormat());
} }
......
...@@ -497,56 +497,55 @@ GLenum Framebuffer::getImplementationColorReadFormat() const ...@@ -497,56 +497,55 @@ GLenum Framebuffer::getImplementationColorReadFormat() const
if(colorbuffer) if(colorbuffer)
{ {
// Don't return GL_RGBA since that's always supported. Provide a second option here.
switch(colorbuffer->getInternalFormat()) switch(colorbuffer->getInternalFormat())
{ {
case sw::FORMAT_A8B8G8R8I: case sw::FORMAT_A8B8G8R8I: return GL_RGBA_INTEGER;
case sw::FORMAT_A8B8G8R8UI: case sw::FORMAT_A8B8G8R8UI: return GL_RGBA_INTEGER;
case sw::FORMAT_A16B16G16R16I: case sw::FORMAT_A16B16G16R16I: return GL_RGBA_INTEGER;
case sw::FORMAT_A16B16G16R16UI: case sw::FORMAT_A16B16G16R16UI: return GL_RGBA_INTEGER;
case sw::FORMAT_A32B32G32R32I: case sw::FORMAT_A32B32G32R32I: return GL_RGBA_INTEGER;
case sw::FORMAT_A32B32G32R32UI:return GL_RGBA_INTEGER; case sw::FORMAT_A32B32G32R32UI: return GL_RGBA_INTEGER;
case sw::FORMAT_A2B10G10R10: return GL_RGB10_A2; case sw::FORMAT_A2B10G10R10: return GL_RGB10_A2;
case sw::FORMAT_A8B8G8R8I_SNORM: case sw::FORMAT_A8B8G8R8I_SNORM: return GL_RGBA;
case sw::FORMAT_A16B16G16R16F: case sw::FORMAT_A8B8G8R8: return GL_RGBA;
case sw::FORMAT_A32B32G32R32F: case sw::FORMAT_SRGB8_A8: return GL_RGBA;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_A8B8G8R8: case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT;
case sw::FORMAT_SRGB8_A8: case sw::FORMAT_X8B8G8R8I: return GL_RGBA_INTEGER;
case sw::FORMAT_A1R5G5B5: return GL_BGRA_EXT; case sw::FORMAT_X8B8G8R8UI: return GL_RGBA_INTEGER;
case sw::FORMAT_X8B8G8R8I: case sw::FORMAT_X16B16G16R16I: return GL_RGBA_INTEGER;
case sw::FORMAT_X8B8G8R8UI: case sw::FORMAT_X16B16G16R16UI: return GL_RGBA_INTEGER;
case sw::FORMAT_X16B16G16R16I: case sw::FORMAT_X32B32G32R32I: return GL_RGBA_INTEGER;
case sw::FORMAT_X16B16G16R16UI: case sw::FORMAT_X32B32G32R32UI: return GL_RGBA_INTEGER;
case sw::FORMAT_X32B32G32R32I: case sw::FORMAT_X8B8G8R8I_SNORM: return GL_RGBA;
case sw::FORMAT_X32B32G32R32UI:return GL_RGB_INTEGER; case sw::FORMAT_SRGB8_X8: return GL_RGBA;
case sw::FORMAT_X32B32G32R32F: case sw::FORMAT_X8B8G8R8: return GL_RGBA;
case sw::FORMAT_B16G16R16F: case sw::FORMAT_X8R8G8B8: return GL_BGRA_EXT;
case sw::FORMAT_X8B8G8R8I_SNORM: case sw::FORMAT_R5G6B5: return GL_RGB;
case sw::FORMAT_SRGB8_X8: case sw::FORMAT_G8R8I: return GL_RG_INTEGER;
case sw::FORMAT_X8B8G8R8: return GL_RGB; case sw::FORMAT_G8R8UI: return GL_RG_INTEGER;
case sw::FORMAT_X8R8G8B8: return 0x80E0; // GL_BGR_EXT case sw::FORMAT_G16R16I: return GL_RG_INTEGER;
case sw::FORMAT_R5G6B5: return GL_RGB; case sw::FORMAT_G16R16UI: return GL_RG_INTEGER;
case sw::FORMAT_G8R8I: case sw::FORMAT_G32R32I: return GL_RG_INTEGER;
case sw::FORMAT_G8R8UI: case sw::FORMAT_G32R32UI: return GL_RG_INTEGER;
case sw::FORMAT_G16R16I: case sw::FORMAT_R8I: return GL_RED_INTEGER;
case sw::FORMAT_G16R16UI: case sw::FORMAT_R8UI: return GL_RED_INTEGER;
case sw::FORMAT_G32R32I: case sw::FORMAT_R16I: return GL_RED_INTEGER;
case sw::FORMAT_G32R32UI: return GL_RG_INTEGER; case sw::FORMAT_R16UI: return GL_RED_INTEGER;
case sw::FORMAT_G8R8: case sw::FORMAT_R32I: return GL_RED_INTEGER;
case sw::FORMAT_G8R8I_SNORM: case sw::FORMAT_R32UI: return GL_RED_INTEGER;
case sw::FORMAT_G16R16F: case sw::FORMAT_R8: return GL_RED;
case sw::FORMAT_G32R32F: return GL_RG; case sw::FORMAT_R8I_SNORM: return GL_RED;
case sw::FORMAT_R8I: case sw::FORMAT_R16F: return GL_RED;
case sw::FORMAT_R8UI: case sw::FORMAT_R32F: return GL_RED;
case sw::FORMAT_R16I: case sw::FORMAT_G8R8: return GL_RG;
case sw::FORMAT_R16UI: case sw::FORMAT_G8R8I_SNORM: return GL_RG;
case sw::FORMAT_R32I: case sw::FORMAT_G16R16F: return GL_RG;
case sw::FORMAT_R32UI: return GL_RED_INTEGER; case sw::FORMAT_G32R32F: return GL_RG;
case sw::FORMAT_R8: case sw::FORMAT_B16G16R16F: return GL_RGB;
case sw::FORMAT_R8I_SNORM: case sw::FORMAT_X32B32G32R32F: return GL_RGBA;
case sw::FORMAT_R16F: case sw::FORMAT_A16B16G16R16F: return GL_RGBA;
case sw::FORMAT_R32F: return GL_RED; case sw::FORMAT_A32B32G32R32F: return GL_RGBA;
default: default:
UNREACHABLE(colorbuffer->getInternalFormat()); UNREACHABLE(colorbuffer->getInternalFormat());
} }
...@@ -563,54 +562,54 @@ GLenum Framebuffer::getImplementationColorReadType() const ...@@ -563,54 +562,54 @@ GLenum Framebuffer::getImplementationColorReadType() const
{ {
switch(colorbuffer->getInternalFormat()) switch(colorbuffer->getInternalFormat())
{ {
case sw::FORMAT_R16F: case sw::FORMAT_R16F: return GL_FLOAT;
case sw::FORMAT_G16R16F: case sw::FORMAT_G16R16F: return GL_FLOAT;
case sw::FORMAT_B16G16R16F: case sw::FORMAT_B16G16R16F: return GL_FLOAT;
case sw::FORMAT_A16B16G16R16F: case sw::FORMAT_A16B16G16R16F: return GL_FLOAT;
case sw::FORMAT_R32F: case sw::FORMAT_R32F: return GL_FLOAT;
case sw::FORMAT_G32R32F: case sw::FORMAT_G32R32F: return GL_FLOAT;
case sw::FORMAT_B32G32R32F: case sw::FORMAT_B32G32R32F: return GL_FLOAT;
case sw::FORMAT_X32B32G32R32F: case sw::FORMAT_X32B32G32R32F: return GL_FLOAT;
case sw::FORMAT_A32B32G32R32F: return GL_FLOAT; case sw::FORMAT_A32B32G32R32F: return GL_FLOAT;
case sw::FORMAT_R8I_SNORM: case sw::FORMAT_R8I_SNORM: return GL_BYTE;
case sw::FORMAT_G8R8I_SNORM: case sw::FORMAT_G8R8I_SNORM: return GL_BYTE;
case sw::FORMAT_X8B8G8R8I_SNORM: case sw::FORMAT_X8B8G8R8I_SNORM: return GL_BYTE;
case sw::FORMAT_A8B8G8R8I_SNORM:return GL_BYTE; case sw::FORMAT_A8B8G8R8I_SNORM: return GL_BYTE;
case sw::FORMAT_R8: case sw::FORMAT_R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_G8R8: case sw::FORMAT_G8R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_SRGB8_X8: case sw::FORMAT_SRGB8_X8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_SRGB8_A8: case sw::FORMAT_SRGB8_A8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A8R8G8B8: case sw::FORMAT_A8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_A8B8G8R8: case sw::FORMAT_A8B8G8R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8R8G8B8: case sw::FORMAT_X8R8G8B8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_X8B8G8R8: return GL_UNSIGNED_BYTE; case sw::FORMAT_X8B8G8R8: return GL_UNSIGNED_BYTE;
case sw::FORMAT_R8I: case sw::FORMAT_R8I: return GL_INT;
case sw::FORMAT_G8R8I: case sw::FORMAT_G8R8I: return GL_INT;
case sw::FORMAT_X8B8G8R8I: case sw::FORMAT_X8B8G8R8I: return GL_INT;
case sw::FORMAT_A8B8G8R8I: case sw::FORMAT_A8B8G8R8I: return GL_INT;
case sw::FORMAT_R16I: case sw::FORMAT_R16I: return GL_INT;
case sw::FORMAT_G16R16I: case sw::FORMAT_G16R16I: return GL_INT;
case sw::FORMAT_X16B16G16R16I: case sw::FORMAT_X16B16G16R16I: return GL_INT;
case sw::FORMAT_A16B16G16R16I: case sw::FORMAT_A16B16G16R16I: return GL_INT;
case sw::FORMAT_R32I: case sw::FORMAT_R32I: return GL_INT;
case sw::FORMAT_G32R32I: case sw::FORMAT_G32R32I: return GL_INT;
case sw::FORMAT_X32B32G32R32I: case sw::FORMAT_X32B32G32R32I: return GL_INT;
case sw::FORMAT_A32B32G32R32I: return GL_INT; case sw::FORMAT_A32B32G32R32I: return GL_INT;
case sw::FORMAT_R8UI: case sw::FORMAT_R8UI: return GL_UNSIGNED_INT;
case sw::FORMAT_G8R8UI: case sw::FORMAT_G8R8UI: return GL_UNSIGNED_INT;
case sw::FORMAT_X8B8G8R8UI: case sw::FORMAT_X8B8G8R8UI: return GL_UNSIGNED_INT;
case sw::FORMAT_A8B8G8R8UI: case sw::FORMAT_A8B8G8R8UI: return GL_UNSIGNED_INT;
case sw::FORMAT_R16UI: case sw::FORMAT_R16UI: return GL_UNSIGNED_INT;
case sw::FORMAT_G16R16UI: case sw::FORMAT_G16R16UI: return GL_UNSIGNED_INT;
case sw::FORMAT_X16B16G16R16UI: case sw::FORMAT_X16B16G16R16UI: return GL_UNSIGNED_INT;
case sw::FORMAT_A16B16G16R16UI: case sw::FORMAT_A16B16G16R16UI: return GL_UNSIGNED_INT;
case sw::FORMAT_R32UI: case sw::FORMAT_R32UI: return GL_UNSIGNED_INT;
case sw::FORMAT_G32R32UI: case sw::FORMAT_G32R32UI: return GL_UNSIGNED_INT;
case sw::FORMAT_X32B32G32R32UI: case sw::FORMAT_X32B32G32R32UI: return GL_UNSIGNED_INT;
case sw::FORMAT_A32B32G32R32UI: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_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_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_R5G6B5: return GL_UNSIGNED_SHORT_5_6_5;
default: default:
UNREACHABLE(colorbuffer->getInternalFormat()); UNREACHABLE(colorbuffer->getInternalFormat());
} }
......
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