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/9030
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Framebuffer.cpp b/src/OpenGL/libGLES_CM/Framebuffer.cpp
index 5dfa67c..933aa2a 100644
--- a/src/OpenGL/libGLES_CM/Framebuffer.cpp
+++ b/src/OpenGL/libGLES_CM/Framebuffer.cpp
@@ -405,15 +405,14 @@
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 @@
{
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());
}
diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index 8b1eda5..6227577 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -497,56 +497,55 @@
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 @@
{
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());
}