Use matching internal and external formats for RGBA8 images.

Change-Id: I056e1a4c7ace83207bed85ce28aca187d72adc6f
Reviewed-on: https://swiftshader-review.googlesource.com/2757
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLES_CM/Framebuffer.cpp b/src/OpenGL/libGLES_CM/Framebuffer.cpp
index 311b34f..04dd9ad 100644
--- a/src/OpenGL/libGLES_CM/Framebuffer.cpp
+++ b/src/OpenGL/libGLES_CM/Framebuffer.cpp
@@ -406,10 +406,13 @@
 	
 	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_X8R8G8B8:      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
 		default:
@@ -429,7 +432,9 @@
 		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;
 		default:
diff --git a/src/OpenGL/libGLES_CM/Image.cpp b/src/OpenGL/libGLES_CM/Image.cpp
index e025169..a66d2eb 100644
--- a/src/OpenGL/libGLES_CM/Image.cpp
+++ b/src/OpenGL/libGLES_CM/Image.cpp
@@ -118,13 +118,17 @@
 			{
 				return sw::FORMAT_A8L8;
 			}
-			else if(format == GL_RGBA || format == GL_BGRA_EXT)
+			else if(format == GL_RGBA)
+			{
+				return sw::FORMAT_A8B8G8R8;
+			}
+			else if(format == GL_BGRA_EXT)
 			{
 				return sw::FORMAT_A8R8G8B8;
 			}
 			else if(format == GL_RGB)
 			{
-				return sw::FORMAT_X8R8G8B8;
+				return sw::FORMAT_X8B8G8R8;
 			}
 			else if(format == GL_ALPHA)
 			{
@@ -154,7 +158,7 @@
 		}
 		else UNREACHABLE();
 
-		return sw::FORMAT_A8R8G8B8;
+		return sw::FORMAT_A8B8G8R8;
 	}
 
 	void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint unpackAlignment, const void *input)
@@ -184,10 +188,8 @@
 					loadRGBUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 					break;
 				case GL_RGBA:
-					loadRGBAUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
-					break;
 				case GL_BGRA_EXT:
-					loadBGRAImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
+					loadRGBAUByteImageData(xoffset, yoffset, width, height, inputPitch, input, buffer);
 					break;
 				default: UNREACHABLE();
 				}
@@ -350,9 +352,9 @@
 			
 			for(int x = 0; x < width; x++)
 			{
-				dest[4 * x + 0] = source[x * 3 + 2];
+				dest[4 * x + 0] = source[x * 3 + 0];
 				dest[4 * x + 1] = source[x * 3 + 1];
-				dest[4 * x + 2] = source[x * 3 + 0];
+				dest[4 * x + 2] = source[x * 3 + 2];
 				dest[4 * x + 3] = 0xFF;
 			}
 		}
@@ -400,11 +402,7 @@
 			const unsigned int *source = reinterpret_cast<const unsigned int*>(static_cast<const unsigned char*>(input) + y * inputPitch);
 			unsigned int *dest = reinterpret_cast<unsigned int*>(static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4);
 
-			for(int x = 0; x < width; x++)
-			{
-				unsigned int rgba = source[x];
-				dest[x] = (rgba & 0xFF00FF00) | ((rgba << 16) & 0x00FF0000) | ((rgba >> 16) & 0x000000FF);
-			}
+			memcpy(dest, source, width * 4);
 		}
 	}
 
@@ -455,17 +453,6 @@
 		}
 	}
 
-	void Image::loadBGRAImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const
-	{
-		for(int y = 0; y < height; y++)
-		{
-			const unsigned char *source = static_cast<const unsigned char*>(input) + y * inputPitch;
-			unsigned char *dest = static_cast<unsigned char*>(buffer) + (y + yoffset) * getPitch() + xoffset * 4;
-			
-			memcpy(dest, source, width*4);
-		}
-	}
-
 	void Image::loadD16ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const
 	{
 		for(int y = 0; y < height; y++)
diff --git a/src/OpenGL/libGLES_CM/Image.hpp b/src/OpenGL/libGLES_CM/Image.hpp
index 223d6ce..defae50 100644
--- a/src/OpenGL/libGLES_CM/Image.hpp
+++ b/src/OpenGL/libGLES_CM/Image.hpp
@@ -58,7 +58,6 @@
 		void loadRGBA4444ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
 		void loadRGBA5551ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
 		void loadRGBAFloatImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
-		void loadBGRAImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
 		void loadD16ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
 		void loadD32ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer) const;
 		void loadD24S8ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, int inputPitch, const void *input, void *buffer);
diff --git a/src/OpenGL/libGLES_CM/Renderbuffer.cpp b/src/OpenGL/libGLES_CM/Renderbuffer.cpp
index 5697e90..070a7a6 100644
--- a/src/OpenGL/libGLES_CM/Renderbuffer.cpp
+++ b/src/OpenGL/libGLES_CM/Renderbuffer.cpp
@@ -250,7 +250,7 @@
 	mWidth = 0;
 	mHeight = 0;
 	format = GL_RGBA4_OES;
-	internalFormat = sw::FORMAT_A8R8G8B8;
+	internalFormat = sw::FORMAT_A8B8G8R8;
 	mSamples = 0;
 }
 
diff --git a/src/OpenGL/libGLES_CM/Texture.cpp b/src/OpenGL/libGLES_CM/Texture.cpp
index 9469d50..7b767e2 100644
--- a/src/OpenGL/libGLES_CM/Texture.cpp
+++ b/src/OpenGL/libGLES_CM/Texture.cpp
@@ -444,9 +444,13 @@
     switch(surface->getInternalFormat())

     {

     case sw::FORMAT_A8R8G8B8:

+		format = GL_BGRA_EXT;

+        break;

+	case sw::FORMAT_A8B8G8R8:

         format = GL_RGBA;

         break;

-    case sw::FORMAT_X8R8G8B8:

+    case sw::FORMAT_X8B8G8R8:

+	case sw::FORMAT_X8R8G8B8:

         format = GL_RGB;

         break;

     default:

diff --git a/src/OpenGL/libGLES_CM/utilities.cpp b/src/OpenGL/libGLES_CM/utilities.cpp
index d91d5ca..e583e2e 100644
--- a/src/OpenGL/libGLES_CM/utilities.cpp
+++ b/src/OpenGL/libGLES_CM/utilities.cpp
@@ -458,13 +458,13 @@
 		{

 		case GL_RGBA4_OES:

 		case GL_RGB5_A1_OES:

-		case GL_RGBA8_OES:            return sw::FORMAT_A8R8G8B8;

+		case GL_RGBA8_OES:            return sw::FORMAT_A8B8G8R8;

 		case GL_RGB565_OES:           return sw::FORMAT_R5G6B5;

-		case GL_RGB8_OES:             return sw::FORMAT_X8R8G8B8;

+		case GL_RGB8_OES:             return sw::FORMAT_X8B8G8R8;

 		case GL_DEPTH_COMPONENT16_OES:

-		case GL_STENCIL_INDEX8_OES:       

+		case GL_STENCIL_INDEX8_OES:

 		case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;

-		default: UNREACHABLE();       return sw::FORMAT_A8R8G8B8;

+		default: UNREACHABLE();       return sw::FORMAT_A8B8G8R8;

 		}

 	}

 

@@ -560,10 +560,12 @@
 		case sw::FORMAT_A2R10G10B10:

 			return 2;

 		case sw::FORMAT_A8R8G8B8:

+		case sw::FORMAT_A8B8G8R8:

 			return 8;

 		case sw::FORMAT_A1R5G5B5:

 			return 1;

 		case sw::FORMAT_X8R8G8B8:

+		case sw::FORMAT_X8B8G8R8:

 		case sw::FORMAT_R5G6B5:

 			return 0;

 		default:

@@ -582,7 +584,9 @@
 		case sw::FORMAT_A2R10G10B10:

 			return 10;

 		case sw::FORMAT_A8R8G8B8:

+		case sw::FORMAT_A8B8G8R8:

 		case sw::FORMAT_X8R8G8B8:

+		case sw::FORMAT_X8B8G8R8:

 			return 8;

 		case sw::FORMAT_A1R5G5B5:

 		case sw::FORMAT_R5G6B5:

@@ -603,7 +607,9 @@
 		case sw::FORMAT_A2R10G10B10:

 			return 10;

 		case sw::FORMAT_A8R8G8B8:

+		case sw::FORMAT_A8B8G8R8:

 		case sw::FORMAT_X8R8G8B8:

+		case sw::FORMAT_X8B8G8R8:

 			return 8;

 		case sw::FORMAT_A1R5G5B5:

 			return 5;

@@ -625,7 +631,9 @@
 		case sw::FORMAT_A2R10G10B10:

 			return 10;

 		case sw::FORMAT_A8R8G8B8:

+		case sw::FORMAT_A8B8G8R8:

 		case sw::FORMAT_X8R8G8B8:

+		case sw::FORMAT_X8B8G8R8:

 			return 8;

 		case sw::FORMAT_A1R5G5B5:

 		case sw::FORMAT_R5G6B5:

@@ -661,9 +669,11 @@
 		{

 		case sw::FORMAT_A4R4G4B4: return GL_RGBA4_OES;

 		case sw::FORMAT_A8R8G8B8: return GL_RGBA8_OES;

+		case sw::FORMAT_A8B8G8R8: return GL_RGBA8_OES;

 		case sw::FORMAT_A1R5G5B5: return GL_RGB5_A1_OES;

 		case sw::FORMAT_R5G6B5:   return GL_RGB565_OES;

 		case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES;

+		case sw::FORMAT_X8B8G8R8: return GL_RGB8_OES;

 		default:

 			UNREACHABLE();

 		}

diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index a604563..d59b715 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -405,12 +405,15 @@
 	
 	if(colorbuffer)
 	{
+		// Don't return GL_RGBA since that's always supported. Provide a second option here.
 		switch(colorbuffer->getInternalFormat())
 		{
-		case sw::FORMAT_A16B16G16R16F: return GL_RGBA;
-		case sw::FORMAT_A32B32G32R32F: return GL_RGBA;
+		case sw::FORMAT_A16B16G16R16F: return GL_BGRA_EXT;
+		case sw::FORMAT_A32B32G32R32F: return GL_BGRA_EXT;
 		case sw::FORMAT_A8R8G8B8:      return GL_BGRA_EXT;
-		case sw::FORMAT_X8R8G8B8:      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
 		default:
@@ -432,7 +435,9 @@
 		case sw::FORMAT_A16B16G16R16F: return GL_HALF_FLOAT_OES;
 		case sw::FORMAT_A32B32G32R32F: return GL_FLOAT;
 		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:
diff --git a/src/OpenGL/libGLESv2/Image.cpp b/src/OpenGL/libGLESv2/Image.cpp
index dd8acd7..cfca395 100644
--- a/src/OpenGL/libGLESv2/Image.cpp
+++ b/src/OpenGL/libGLESv2/Image.cpp
@@ -31,16 +31,15 @@
 		LuminanceAlpha,
 		LuminanceAlphaFloat,
 		LuminanceAlphaHalfFloat,
-		RGBUByte,
+		UByteRGB,
 		RGB565,
-		RGBFloat,
-		RGBHalfFloat,
-		RGBAUByte,
+		FloatRGB,
+		HalfFloatRGB,
+		UByte4,
 		RGBA4444,
 		RGBA5551,
-		RGBAFloat,
-		RGBAHalfFloat,
-		BGRA,
+		Float4,
+		HalfFloat4,
 		D16,
 		D24,
 		D32,
@@ -162,15 +161,15 @@
 	}
 
 	template<>
-	void LoadImageRow<RGBUByte>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
+	void LoadImageRow<UByteRGB>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		unsigned char *destB = dest + xoffset * 4;
 
 		for(int x = 0; x < width; x++)
 		{
-			destB[4 * x + 0] = source[x * 3 + 2];
+			destB[4 * x + 0] = source[x * 3 + 0];
 			destB[4 * x + 1] = source[x * 3 + 1];
-			destB[4 * x + 2] = source[x * 3 + 0];
+			destB[4 * x + 2] = source[x * 3 + 2];
 			destB[4 * x + 3] = 0xFF;
 		}
 	}
@@ -192,7 +191,7 @@
 	}
 
 	template<>
-	void LoadImageRow<RGBFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
+	void LoadImageRow<FloatRGB>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const float *sourceF = reinterpret_cast<const float*>(source);
 		float *destF = reinterpret_cast<float*>(dest + xoffset * 16);
@@ -207,7 +206,7 @@
 	}
 
 	template<>
-	void LoadImageRow<RGBHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
+	void LoadImageRow<HalfFloatRGB>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *sourceH = reinterpret_cast<const unsigned short*>(source);
 		unsigned short *destH = reinterpret_cast<unsigned short*>(dest + xoffset * 8);
@@ -222,15 +221,14 @@
 	}
 
 	template<>
-	void LoadImageRow<RGBAUByte>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
+	void LoadImageRow<UByte4>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned int *sourceI = reinterpret_cast<const unsigned int*>(source);
 		unsigned int *destI = reinterpret_cast<unsigned int*>(dest + xoffset * 4);
 
 		for(int x = 0; x < width; x++)
 		{
-			unsigned int rgba = sourceI[x];
-			destI[x] = (rgba & 0xFF00FF00) | ((rgba << 16) & 0x00FF0000) | ((rgba >> 16) & 0x000000FF);
+			memcpy(dest + xoffset * 4, source, width * 4);
 		}
 	}
 
@@ -267,24 +265,18 @@
 	}
 
 	template<>
-	void LoadImageRow<RGBAFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
+	void LoadImageRow<Float4>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		memcpy(dest + xoffset * 16, source, width * 16);
 	}
 
 	template<>
-	void LoadImageRow<RGBAHalfFloat>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
+	void LoadImageRow<HalfFloat4>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		memcpy(dest + xoffset * 8, source, width * 8);
 	}
 
 	template<>
-	void LoadImageRow<BGRA>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
-	{
-		memcpy(dest + xoffset * 4, source, width * 4);
-	}
-
-	template<>
 	void LoadImageRow<D16>(const unsigned char *source, unsigned char *dest, GLint xoffset, GLsizei width)
 	{
 		const unsigned short *sourceD16 = reinterpret_cast<const unsigned short*>(source);
@@ -337,8 +329,8 @@
 	{
 		for(int z = 0; z < depth; ++z)
 		{
-			const unsigned char *inputStart = static_cast<const unsigned char*>(input)+(z * inputPitch * height);
-			unsigned char *destStart = static_cast<unsigned char*>(buffer)+((zoffset + z) * destPitch * destHeight);
+			const unsigned char *inputStart = static_cast<const unsigned char*>(input) + (z * inputPitch * height);
+			unsigned char *destStart = static_cast<unsigned char*>(buffer) + ((zoffset + z) * destPitch * destHeight);
 			for(int y = 0; y < height; ++y)
 			{
 				const unsigned char *source = inputStart + y * inputPitch;
@@ -468,13 +460,17 @@
 			{
 				return sw::FORMAT_A8L8;
 			}
-			else if(format == GL_RGBA || format == GL_BGRA_EXT)
+			else if(format == GL_RGBA)
+			{
+				return sw::FORMAT_A8B8G8R8;
+			}
+			else if(format == GL_BGRA_EXT)
 			{
 				return sw::FORMAT_A8R8G8B8;
 			}
 			else if(format == GL_RGB)
 			{
-				return sw::FORMAT_X8R8G8B8;
+				return sw::FORMAT_X8B8G8R8;
 			}
 			else if(format == GL_ALPHA)
 			{
@@ -512,7 +508,7 @@
 		}
 		else UNREACHABLE();
 
-		return sw::FORMAT_A8R8G8B8;
+		return sw::FORMAT_A8B8G8R8;
 	}
 
 	void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLint unpackAlignment, const void *input)
@@ -537,13 +533,11 @@
 					LoadImageData<LuminanceAlpha>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				case GL_RGB:
-					LoadImageData<RGBUByte>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
+					LoadImageData<UByteRGB>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				case GL_RGBA:
-					LoadImageData<RGBAUByte>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
-					break;
 				case GL_BGRA_EXT:
-					LoadImageData<BGRA>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
+					LoadImageData<UByte4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				default: UNREACHABLE();
 				}
@@ -578,7 +572,6 @@
 			case GL_FLOAT:
 				switch(format)
 				{
-				// float textures are converted to RGBA, not BGRA
 				case GL_ALPHA:
 					LoadImageData<AlphaFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
@@ -589,10 +582,10 @@
 					LoadImageData<LuminanceAlphaFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				case GL_RGB:
-					LoadImageData<RGBFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
+					LoadImageData<FloatRGB>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				case GL_RGBA:
-					LoadImageData<RGBAFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
+					LoadImageData<Float4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				default: UNREACHABLE();
 				}
@@ -600,7 +593,6 @@
 			case GL_HALF_FLOAT_OES:
 				switch(format)
 				{
-				// float textures are converted to RGBA, not BGRA
 				case GL_ALPHA:
 					LoadImageData<AlphaHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
@@ -611,10 +603,10 @@
 					LoadImageData<LuminanceAlphaHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				case GL_RGB:
-					LoadImageData<RGBHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
+					LoadImageData<HalfFloatRGB>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				case GL_RGBA:
-					LoadImageData<RGBAHalfFloat>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
+					LoadImageData<HalfFloat4>(xoffset, yoffset, zoffset, width, height, depth, inputPitch, getPitch(), getHeight(), input, buffer);
 					break;
 				default: UNREACHABLE();
 				}
@@ -653,7 +645,7 @@
 	{
 		if(zoffset != 0 || depth != 1)
 		{
-			UNIMPLEMENTED(); // FIXME
+			UNIMPLEMENTED();   // FIXME
 		}
 
 		int inputPitch = ComputeCompressedPitch(width, format);
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index d250869..b35405d 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -386,7 +386,7 @@
 	mWidth = 0;
 	mHeight = 0;
 	format = GL_RGBA4;
-	internalFormat = sw::FORMAT_A8R8G8B8;
+	internalFormat = sw::FORMAT_A8B8G8R8;
 	mSamples = 0;
 }
 
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index cdacf10..17fabf4 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -444,9 +444,13 @@
     switch(surface->getInternalFormat())

     {

     case sw::FORMAT_A8R8G8B8:

+		format = GL_BGRA_EXT;

+        break;

+	case sw::FORMAT_A8B8G8R8:

         format = GL_RGBA;

         break;

-    case sw::FORMAT_X8R8G8B8:

+    case sw::FORMAT_X8B8G8R8:

+	case sw::FORMAT_X8R8G8B8:

         format = GL_RGB;

         break;

     default:

diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index f9db21c..f15e210 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -673,13 +673,13 @@
 		{

 		case GL_RGBA4:

 		case GL_RGB5_A1:

-		case GL_RGBA8_OES:            return sw::FORMAT_A8R8G8B8;

+		case GL_RGBA8_OES:            return sw::FORMAT_A8B8G8R8;

 		case GL_RGB565:               return sw::FORMAT_R5G6B5;

-		case GL_RGB8_OES:             return sw::FORMAT_X8R8G8B8;

+		case GL_RGB8_OES:             return sw::FORMAT_X8B8G8R8;

 		case GL_DEPTH_COMPONENT16:

 		case GL_STENCIL_INDEX8:       

 		case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;

-		default: UNREACHABLE();       return sw::FORMAT_A8R8G8B8;

+		default: UNREACHABLE();       return sw::FORMAT_A8B8G8R8;

 		}

 	}

 }

@@ -722,10 +722,12 @@
 		case sw::FORMAT_A2R10G10B10:

 			return 2;

 		case sw::FORMAT_A8R8G8B8:

+		case sw::FORMAT_A8B8G8R8:

 			return 8;

 		case sw::FORMAT_A1R5G5B5:

 			return 1;

 		case sw::FORMAT_X8R8G8B8:

+		case sw::FORMAT_X8B8G8R8:

 		case sw::FORMAT_R5G6B5:

 			return 0;

 		default:

@@ -744,7 +746,9 @@
 		case sw::FORMAT_A2R10G10B10:

 			return 10;

 		case sw::FORMAT_A8R8G8B8:

+		case sw::FORMAT_A8B8G8R8:

 		case sw::FORMAT_X8R8G8B8:

+		case sw::FORMAT_X8B8G8R8:

 			return 8;

 		case sw::FORMAT_A1R5G5B5:

 		case sw::FORMAT_R5G6B5:

@@ -765,7 +769,9 @@
 		case sw::FORMAT_A2R10G10B10:

 			return 10;

 		case sw::FORMAT_A8R8G8B8:

+		case sw::FORMAT_A8B8G8R8:

 		case sw::FORMAT_X8R8G8B8:

+		case sw::FORMAT_X8B8G8R8:

 			return 8;

 		case sw::FORMAT_A1R5G5B5:

 			return 5;

@@ -787,7 +793,9 @@
 		case sw::FORMAT_A2R10G10B10:

 			return 10;

 		case sw::FORMAT_A8R8G8B8:

+		case sw::FORMAT_A8B8G8R8:

 		case sw::FORMAT_X8R8G8B8:

+		case sw::FORMAT_X8B8G8R8:

 			return 8;

 		case sw::FORMAT_A1R5G5B5:

 		case sw::FORMAT_R5G6B5:

@@ -823,9 +831,11 @@
 		{

 		case sw::FORMAT_A4R4G4B4: return GL_RGBA4;

 		case sw::FORMAT_A8R8G8B8: return GL_RGBA8_OES;

+		case sw::FORMAT_A8B8G8R8: return GL_RGBA8_OES;

 		case sw::FORMAT_A1R5G5B5: return GL_RGB5_A1;

 		case sw::FORMAT_R5G6B5:   return GL_RGB565;

 		case sw::FORMAT_X8R8G8B8: return GL_RGB8_OES;

+		case sw::FORMAT_X8B8G8R8: return GL_RGB8_OES;

 		default:

 			UNREACHABLE();

 		}