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());
 		}