Untangle internal & implementation format.

Textures and renderbuffers were storing both the OpenGL internalformat
and the SwiftShader implementation format (i.e. sw::Format). This
change removes the implementation format, only keeping it in the Image
class.

Change-Id: Ie6ac96f6450b9a55ea9b49c6cf4b2c0681e95522
Reviewed-on: https://swiftshader-review.googlesource.com/14528
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 8dec865..981ffe3 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -4139,10 +4139,10 @@
 		// well
 		es2::Renderbuffer *readRenderbuffer = readFramebuffer->getReadColorbuffer();
 		es2::Renderbuffer *drawRenderbuffer = drawFramebuffer->getColorbuffer(0);
-		sw::Format readFormat = readRenderbuffer->getInternalFormat();
-		sw::Format drawFormat = drawRenderbuffer->getInternalFormat();
-		GLenum readComponentType = sw2es::GetComponentType(readFormat, GL_COLOR_ATTACHMENT0);
-		GLenum drawComponentType = sw2es::GetComponentType(drawFormat, GL_COLOR_ATTACHMENT0);
+		GLint readFormat = readRenderbuffer->getFormat();
+		GLint drawFormat = drawRenderbuffer->getFormat();
+		GLenum readComponentType = GetComponentType(readFormat, GL_COLOR_ATTACHMENT0);
+		GLenum drawComponentType = GetComponentType(drawFormat, GL_COLOR_ATTACHMENT0);
 		bool readFixedPoint = ((readComponentType == GL_UNSIGNED_NORMALIZED) ||
 		                       (readComponentType == GL_SIGNED_NORMALIZED));
 		bool drawFixedPoint = ((drawComponentType == GL_UNSIGNED_NORMALIZED) ||
@@ -4201,7 +4201,7 @@
 				readDSBuffer = readFramebuffer->getDepthbuffer();
 				drawDSBuffer = drawFramebuffer->getDepthbuffer();
 
-				if(readDSBuffer->getInternalFormat() != drawDSBuffer->getInternalFormat())
+				if(readDSBuffer->getFormat() != drawDSBuffer->getFormat())
 				{
 					return error(GL_INVALID_OPERATION);
 				}
@@ -4224,7 +4224,7 @@
 				readDSBuffer = readFramebuffer->getStencilbuffer();
 				drawDSBuffer = drawFramebuffer->getStencilbuffer();
 
-				if(readDSBuffer->getInternalFormat() != drawDSBuffer->getInternalFormat())
+				if(readDSBuffer->getFormat() != drawDSBuffer->getFormat())
 				{
 					return error(GL_INVALID_OPERATION);
 				}
diff --git a/src/OpenGL/libGLESv2/Framebuffer.cpp b/src/OpenGL/libGLESv2/Framebuffer.cpp
index fc0c4a3..810771b 100644
--- a/src/OpenGL/libGLESv2/Framebuffer.cpp
+++ b/src/OpenGL/libGLESv2/Framebuffer.cpp
@@ -497,57 +497,54 @@
 
 	if(colorbuffer)
 	{
-		switch(colorbuffer->getInternalFormat())
+		switch(colorbuffer->getFormat())
 		{
-		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;
+		case GL_RGBA4:          return GL_RGBA;
+		case GL_RGB5_A1:        return GL_RGBA;
+		case GL_RGBA8:          return GL_RGBA;
+		case GL_RGB565:         return GL_RGBA;
+		case GL_RGB8:           return GL_RGB;
+		case GL_R8:             return GL_RED;
+		case GL_RG8:            return GL_RG;
+		case GL_R8I:            return GL_RED_INTEGER;
+		case GL_RG8I:           return GL_RG_INTEGER;
+		case GL_RGB8I:          return GL_RGB_INTEGER;
+		case GL_RGBA8I:         return GL_RGBA_INTEGER;
+		case GL_R8UI:           return GL_RED_INTEGER;
+		case GL_RG8UI:          return GL_RG_INTEGER;
+		case GL_RGB8UI:         return GL_RGB_INTEGER;
+		case GL_RGBA8UI:        return GL_RGBA_INTEGER;
+		case GL_R16I:           return GL_RED_INTEGER;
+		case GL_RG16I:          return GL_RG_INTEGER;
+		case GL_RGB16I:         return GL_RGB_INTEGER;
+		case GL_RGBA16I:        return GL_RGBA_INTEGER;
+		case GL_R16UI:          return GL_RED_INTEGER;
+		case GL_RG16UI:         return GL_RG_INTEGER;
+		case GL_RGB16UI:        return GL_RGB_INTEGER;
+		case GL_RGB10_A2UI:     return GL_RGBA_INTEGER;
+		case GL_RGBA16UI:       return GL_RGBA_INTEGER;
+		case GL_R32I:           return GL_RED_INTEGER;
+		case GL_RG32I:          return GL_RG_INTEGER;
+		case GL_RGB32I:         return GL_RGB_INTEGER;
+		case GL_RGBA32I:        return GL_RGBA_INTEGER;
+		case GL_R32UI:          return GL_RED_INTEGER;
+		case GL_RG32UI:         return GL_RG_INTEGER;
+		case GL_RGB32UI:        return GL_RGB_INTEGER;
+		case GL_RGBA32UI:       return GL_RGBA_INTEGER;
+		case GL_R16F:           return GL_RED;
+		case GL_RG16F:          return GL_RG;
+		case GL_R11F_G11F_B10F: return GL_RGB;
+		case GL_RGB16F:         return GL_RGB;
+		case GL_RGBA16F:        return GL_RGBA;
+		case GL_R32F:           return GL_RED;
+		case GL_RG32F:          return GL_RG;
+		case GL_RGB32F:         return GL_RGB;
+		case GL_RGBA32F:        return GL_RGBA;
+		case GL_RGB10_A2:       return GL_RGBA;
+		case GL_SRGB8:          return GL_RGB;
+		case GL_SRGB8_ALPHA8:   return GL_RGBA;
 		default:
-			UNREACHABLE(colorbuffer->getInternalFormat());
+			UNREACHABLE(colorbuffer->getFormat());
 		}
 	}
 
@@ -560,58 +557,54 @@
 
 	if(colorbuffer)
 	{
-		switch(colorbuffer->getInternalFormat())
+		switch(colorbuffer->getFormat())
 		{
-		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;
+		case GL_RGBA4:          return GL_UNSIGNED_BYTE;
+		case GL_RGB5_A1:        return GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT;
+		case GL_RGBA8:          return GL_UNSIGNED_BYTE;
+		case GL_RGB565:         return GL_UNSIGNED_SHORT_5_6_5;
+		case GL_RGB8:           return GL_UNSIGNED_BYTE;
+		case GL_R8:             return GL_UNSIGNED_BYTE;
+		case GL_RG8:            return GL_UNSIGNED_BYTE;
+		case GL_R8I:            return GL_INT;
+		case GL_RG8I:           return GL_INT;
+		case GL_RGB8I:          return GL_INT;
+		case GL_RGBA8I:         return GL_INT;
+		case GL_R8UI:           return GL_UNSIGNED_BYTE;
+		case GL_RG8UI:          return GL_UNSIGNED_BYTE;
+		case GL_RGB8UI:         return GL_UNSIGNED_BYTE;
+		case GL_RGBA8UI:        return GL_UNSIGNED_BYTE;
+		case GL_R16I:           return GL_INT;
+		case GL_RG16I:          return GL_INT;
+		case GL_RGB16I:         return GL_INT;
+		case GL_RGBA16I:        return GL_INT;
+		case GL_R16UI:          return GL_UNSIGNED_INT;
+		case GL_RG16UI:         return GL_UNSIGNED_INT;
+		case GL_RGB16UI:        return GL_UNSIGNED_INT;
+		case GL_RGB10_A2UI:     return GL_UNSIGNED_INT_10_10_10_2_OES;
+		case GL_RGBA16UI:       return GL_UNSIGNED_INT;
+		case GL_R32I:           return GL_INT;
+		case GL_RG32I:          return GL_INT;
+		case GL_RGB32I:         return GL_INT;
+		case GL_RGBA32I:        return GL_INT;
+		case GL_R32UI:          return GL_UNSIGNED_INT;
+		case GL_RG32UI:         return GL_UNSIGNED_INT;
+		case GL_RGB32UI:        return GL_UNSIGNED_INT;
+		case GL_RGBA32UI:       return GL_UNSIGNED_INT;
+		case GL_R16F:           return GL_FLOAT;
+		case GL_RG16F:          return GL_FLOAT;
+		case GL_R11F_G11F_B10F: return GL_FLOAT;
+		case GL_RGB16F:         return GL_FLOAT;
+		case GL_RGBA16F:        return GL_FLOAT;
+		case GL_R32F:           return GL_FLOAT;
+		case GL_RG32F:          return GL_FLOAT;
+		case GL_RGB32F:         return GL_FLOAT;
+		case GL_RGBA32F:        return GL_FLOAT;
+		case GL_RGB10_A2:       return GL_UNSIGNED_INT_10_10_10_2_OES;
+		case GL_SRGB8:          return GL_UNSIGNED_BYTE;
+		case GL_SRGB8_ALPHA8:   return GL_UNSIGNED_BYTE;
 		default:
-			UNREACHABLE(colorbuffer->getInternalFormat());
+			UNREACHABLE(colorbuffer->getFormat());
 		}
 	}
 
@@ -638,18 +631,16 @@
 
 	if(depthbuffer)
 	{
-		switch(depthbuffer->getInternalFormat())
+		switch(depthbuffer->getFormat())
 		{
-		case sw::FORMAT_D16:                return GL_UNSIGNED_SHORT;
-		case sw::FORMAT_D24S8:              return GL_UNSIGNED_INT_24_8_OES;
-		case sw::FORMAT_D32:                return GL_UNSIGNED_INT;
-		case sw::FORMAT_D32F:
-		case sw::FORMAT_D32F_COMPLEMENTARY:
-		case sw::FORMAT_D32F_LOCKABLE:
-		case sw::FORMAT_D32FS8_TEXTURE:
-		case sw::FORMAT_D32FS8_SHADOW:      return GL_FLOAT;
+		case GL_DEPTH_COMPONENT16:     return GL_UNSIGNED_SHORT;
+		case GL_DEPTH_COMPONENT24:     return GL_UNSIGNED_INT;
+		case GL_DEPTH_COMPONENT32_OES: return GL_UNSIGNED_INT;
+		case GL_DEPTH_COMPONENT32F:    return GL_FLOAT;
+		case GL_DEPTH24_STENCIL8:      return GL_UNSIGNED_INT_24_8_OES;
+		case GL_DEPTH32F_STENCIL8:     return GL_FLOAT;
 		default:
-			UNREACHABLE(depthbuffer->getInternalFormat());
+			UNREACHABLE(depthbuffer->getFormat());
 		}
 	}
 
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.cpp b/src/OpenGL/libGLESv2/Renderbuffer.cpp
index 4c4e448..98a1c05 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.cpp
+++ b/src/OpenGL/libGLESv2/Renderbuffer.cpp
@@ -41,32 +41,32 @@
 
 GLuint RenderbufferInterface::getRedSize() const
 {
-	return sw2es::GetRedSize(getInternalFormat());
+	return GetRedSize(getFormat());
 }
 
 GLuint RenderbufferInterface::getGreenSize() const
 {
-	return sw2es::GetGreenSize(getInternalFormat());
+	return GetGreenSize(getFormat());
 }
 
 GLuint RenderbufferInterface::getBlueSize() const
 {
-	return sw2es::GetBlueSize(getInternalFormat());
+	return GetBlueSize(getFormat());
 }
 
 GLuint RenderbufferInterface::getAlphaSize() const
 {
-	return sw2es::GetAlphaSize(getInternalFormat());
+	return GetAlphaSize(getFormat());
 }
 
 GLuint RenderbufferInterface::getDepthSize() const
 {
-	return sw2es::GetDepthSize(getInternalFormat());
+	return GetDepthSize(getFormat());
 }
 
 GLuint RenderbufferInterface::getStencilSize() const
 {
-	return sw2es::GetStencilSize(getInternalFormat());
+	return GetStencilSize(getFormat());
 }
 
 ///// RenderbufferTexture2D Implementation ////////
@@ -122,16 +122,11 @@
 	return mTexture2D->getHeight(GL_TEXTURE_2D, mLevel);
 }
 
-GLenum RenderbufferTexture2D::getFormat() const
+GLint RenderbufferTexture2D::getFormat() const
 {
 	return mTexture2D->getFormat(GL_TEXTURE_2D, mLevel);
 }
 
-sw::Format RenderbufferTexture2D::getInternalFormat() const
-{
-	return mTexture2D->getInternalFormat(GL_TEXTURE_2D, mLevel);
-}
-
 GLsizei RenderbufferTexture2D::getSamples() const
 {
 	return 0;
@@ -199,16 +194,11 @@
 	return mTexture3D->getDepth(mTexture3D->getTarget(), mLevel);
 }
 
-GLenum RenderbufferTexture3D::getFormat() const
+GLint RenderbufferTexture3D::getFormat() const
 {
 	return mTexture3D->getFormat(mTexture3D->getTarget(), mLevel);
 }
 
-sw::Format RenderbufferTexture3D::getInternalFormat() const
-{
-	return mTexture3D->getInternalFormat(mTexture3D->getTarget(), mLevel);
-}
-
 GLsizei RenderbufferTexture3D::getSamples() const
 {
 	return 0;
@@ -267,16 +257,11 @@
 	return mTextureCubeMap->getHeight(mTarget, mLevel);
 }
 
-GLenum RenderbufferTextureCubeMap::getFormat() const
+GLint RenderbufferTextureCubeMap::getFormat() const
 {
 	return mTextureCubeMap->getFormat(mTarget, mLevel);
 }
 
-sw::Format RenderbufferTextureCubeMap::getInternalFormat() const
-{
-	return mTextureCubeMap->getInternalFormat(mTarget, mLevel);
-}
-
 GLsizei RenderbufferTextureCubeMap::getSamples() const
 {
 	return 0;
@@ -355,16 +340,11 @@
 	return mInstance->getLevel();
 }
 
-GLenum Renderbuffer::getFormat() const
+GLint Renderbuffer::getFormat() const
 {
 	return mInstance->getFormat();
 }
 
-sw::Format Renderbuffer::getInternalFormat() const
-{
-	return mInstance->getInternalFormat();
-}
-
 GLuint Renderbuffer::getRedSize() const
 {
 	return mInstance->getRedSize();
@@ -423,7 +403,6 @@
 	mWidth = 0;
 	mHeight = 0;
 	format = GL_RGBA4;
-	internalFormat = sw::FORMAT_NULL;
 	mSamples = 0;
 }
 
@@ -441,16 +420,11 @@
 	return mHeight;
 }
 
-GLenum RenderbufferStorage::getFormat() const
+GLint RenderbufferStorage::getFormat() const
 {
 	return format;
 }
 
-sw::Format RenderbufferStorage::getInternalFormat() const
-{
-	return internalFormat;
-}
-
 GLsizei RenderbufferStorage::getSamples() const
 {
 	return mSamples;
@@ -462,24 +436,25 @@
 	{
 		renderTarget->addRef();
 
+		sw::Format implementationFormat = renderTarget->getInternalFormat();
+		format = sw2es::ConvertBackBufferFormat(implementationFormat);
+
 		mWidth = renderTarget->getWidth();
 		mHeight = renderTarget->getHeight();
-		internalFormat = renderTarget->getInternalFormat();
-		format = sw2es::ConvertBackBufferFormat(internalFormat);
 		mSamples = renderTarget->getDepth() & ~1;
 	}
 }
 
-Colorbuffer::Colorbuffer(int width, int height, GLenum format, GLsizei samples) : mRenderTarget(nullptr)
+Colorbuffer::Colorbuffer(int width, int height, GLenum internalformat, GLsizei samples) : mRenderTarget(nullptr)
 {
 	Device *device = getDevice();
 
-	sw::Format requestedFormat = es2sw::ConvertRenderbufferFormat(format);
+	sw::Format implementationFormat = es2sw::ConvertRenderbufferFormat(internalformat);
 	int supportedSamples = Context::getSupportedMultisampleCount(samples);
 
 	if(width > 0 && height > 0)
 	{
-		mRenderTarget = device->createRenderTarget(width, height, requestedFormat, supportedSamples, false);
+		mRenderTarget = device->createRenderTarget(width, height, implementationFormat, supportedSamples, false);
 
 		if(!mRenderTarget)
 		{
@@ -490,8 +465,7 @@
 
 	mWidth = width;
 	mHeight = height;
-	this->format = format;
-	internalFormat = requestedFormat;
+	format = internalformat;
 	mSamples = supportedSamples;
 }
 
@@ -539,40 +513,42 @@
 	{
 		depthStencil->addRef();
 
+		sw::Format implementationFormat = depthStencil->getInternalFormat();
+		format = sw2es::ConvertDepthStencilFormat(implementationFormat);
+
 		mWidth = depthStencil->getWidth();
 		mHeight = depthStencil->getHeight();
-		internalFormat = depthStencil->getInternalFormat();
-		format = sw2es::ConvertDepthStencilFormat(internalFormat);
 		mSamples = depthStencil->getDepth() & ~1;
 	}
 }
 
-DepthStencilbuffer::DepthStencilbuffer(int width, int height, GLenum requestedFormat, GLsizei samples) : mDepthStencil(nullptr)
+DepthStencilbuffer::DepthStencilbuffer(int width, int height, GLenum internalformat, GLsizei samples) : mDepthStencil(nullptr)
 {
-	format = requestedFormat;
-	switch(requestedFormat)
+	format = internalformat;
+	sw::Format implementationFormat = sw::FORMAT_D24S8;
+	switch(internalformat)
 	{
 	case GL_STENCIL_INDEX8:
 	case GL_DEPTH_COMPONENT24:
 	case GL_DEPTH24_STENCIL8_OES:
-		internalFormat = sw::FORMAT_D24S8;
+		implementationFormat = sw::FORMAT_D24S8;
 		break;
 	case GL_DEPTH32F_STENCIL8:
-		internalFormat = sw::FORMAT_D32FS8_TEXTURE;
+		implementationFormat = sw::FORMAT_D32FS8_TEXTURE;
 		break;
 	case GL_DEPTH_COMPONENT16:
-		internalFormat = sw::FORMAT_D16;
+		implementationFormat = sw::FORMAT_D16;
 		break;
 	case GL_DEPTH_COMPONENT32_OES:
-		internalFormat = sw::FORMAT_D32;
+		implementationFormat = sw::FORMAT_D32;
 		break;
 	case GL_DEPTH_COMPONENT32F:
-		internalFormat = sw::FORMAT_D32F;
+		implementationFormat = sw::FORMAT_D32F;
 		break;
 	default:
-		UNREACHABLE(requestedFormat);
+		UNREACHABLE(internalformat);
 		format = GL_DEPTH24_STENCIL8_OES;
-		internalFormat = sw::FORMAT_D24S8;
+		implementationFormat = sw::FORMAT_D24S8;
 	}
 
 	Device *device = getDevice();
@@ -581,7 +557,7 @@
 
 	if(width > 0 && height > 0)
 	{
-		mDepthStencil = device->createDepthStencilSurface(width, height, internalFormat, supportedSamples, false);
+		mDepthStencil = device->createDepthStencilSurface(width, height, implementationFormat, supportedSamples, false);
 
 		if(!mDepthStencil)
 		{
@@ -637,7 +613,7 @@
 {
 }
 
-Depthbuffer::Depthbuffer(int width, int height, GLenum format, GLsizei samples) : DepthStencilbuffer(width, height, format, samples)
+Depthbuffer::Depthbuffer(int width, int height, GLenum internalformat, GLsizei samples) : DepthStencilbuffer(width, height, internalformat, samples)
 {
 }
 
diff --git a/src/OpenGL/libGLESv2/Renderbuffer.h b/src/OpenGL/libGLESv2/Renderbuffer.h
index 5e3f124..feb8f9e 100644
--- a/src/OpenGL/libGLESv2/Renderbuffer.h
+++ b/src/OpenGL/libGLESv2/Renderbuffer.h
@@ -53,8 +53,7 @@
 	virtual GLsizei getDepth() const { return 1; }
 	virtual GLint getLayer() const { return 0; }
 	virtual GLint getLevel() const { return 0; }
-	virtual GLenum getFormat() const = 0;
-	virtual sw::Format getInternalFormat() const = 0;
+	virtual GLint getFormat() const = 0;
 	virtual GLsizei getSamples() const = 0;
 
 	virtual void setLayer(GLint) {}
@@ -85,8 +84,7 @@
 	virtual GLsizei getWidth() const;
 	virtual GLsizei getHeight() const;
 	virtual GLint getLevel() const { return mLevel; }
-	virtual GLenum getFormat() const;
-	virtual sw::Format getInternalFormat() const;
+	virtual GLint getFormat() const;
 	virtual GLsizei getSamples() const;
 
 	virtual void setLevel(GLint level) { mLevel = level; }
@@ -115,8 +113,7 @@
 	virtual GLsizei getDepth() const;
 	virtual GLint getLayer() const { return mLayer; }
 	virtual GLint getLevel() const { return mLevel; }
-	virtual GLenum getFormat() const;
-	virtual sw::Format getInternalFormat() const;
+	virtual GLint getFormat() const;
 	virtual GLsizei getSamples() const;
 
 	virtual void setLayer(GLint layer) { mLayer = layer; }
@@ -145,8 +142,7 @@
 	virtual GLsizei getWidth() const;
 	virtual GLsizei getHeight() const;
 	virtual GLint getLevel() const { return mLevel; }
-	virtual GLenum getFormat() const;
-	virtual sw::Format getInternalFormat() const;
+	virtual GLint getFormat() const;
 	virtual GLsizei getSamples() const;
 
 	virtual void setLevel(GLint level) { mLevel = level; }
@@ -173,15 +169,13 @@
 
 	virtual GLsizei getWidth() const;
 	virtual GLsizei getHeight() const;
-	virtual GLenum getFormat() const;
-	virtual sw::Format getInternalFormat() const;
+	virtual GLint getFormat() const;
 	virtual GLsizei getSamples() const;
 
 protected:
 	GLsizei mWidth;
 	GLsizei mHeight;
 	GLenum format;
-	sw::Format internalFormat;
 	GLsizei mSamples;
 };
 
@@ -211,8 +205,7 @@
 	GLsizei getDepth() const;
 	GLint getLayer() const;
 	GLint getLevel() const;
-	GLenum getFormat() const;
-	sw::Format getInternalFormat() const;
+	GLint getFormat() const;
 	GLuint getRedSize() const;
 	GLuint getGreenSize() const;
 	GLuint getBlueSize() const;
@@ -233,7 +226,7 @@
 {
 public:
 	explicit Colorbuffer(egl::Image *renderTarget);
-	Colorbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
+	Colorbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
 
 	virtual ~Colorbuffer();
 
@@ -249,7 +242,7 @@
 {
 public:
 	explicit DepthStencilbuffer(egl::Image *depthStencil);
-	DepthStencilbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
+	DepthStencilbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
 
 	~DepthStencilbuffer();
 
@@ -265,7 +258,7 @@
 {
 public:
 	explicit Depthbuffer(egl::Image *depthStencil);
-	Depthbuffer(GLsizei width, GLsizei height, GLenum format, GLsizei samples);
+	Depthbuffer(GLsizei width, GLsizei height, GLenum internalformat, GLsizei samples);
 
 	virtual ~Depthbuffer();
 };
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index 77e6d3f..6618859 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -450,7 +450,7 @@
 	}
 }
 
-bool Texture::copy(egl::Image *source, const sw::SliceRect &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, GLint zoffset, egl::Image *dest)
+bool Texture::copy(egl::Image *source, const sw::SliceRect &sourceRect, GLint xoffset, GLint yoffset, GLint zoffset, egl::Image *dest)
 {
 	Device *device = getDevice();
 
@@ -589,12 +589,6 @@
 	return image[level] ? image[level]->getType() : GL_NONE;
 }
 
-sw::Format Texture2D::getInternalFormat(GLenum target, GLint level) const
-{
-	ASSERT(target == GL_TEXTURE_2D);
-	return image[level] ? image[level]->getInternalFormat() : sw::FORMAT_NULL;
-}
-
 int Texture2D::getLevelCount() const
 {
 	ASSERT(isSamplerComplete());
@@ -673,7 +667,7 @@
 		image[level]->release();
 	}
 
-	GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
+	GLint sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
 	image[level] = egl::Image::create(this, width, height, sizedInternalFormat, GL_UNSIGNED_BYTE);
 
 	if(!image[level])
@@ -709,7 +703,7 @@
 		image[level]->release();
 	}
 
-	GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
+	GLint sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
 	image[level] = egl::Image::create(this, width, height, sizedInternalFormat, GL_UNSIGNED_BYTE);
 
 	if(!image[level])
@@ -730,7 +724,7 @@
 		sw::SliceRect sourceRect(x, y, x + width, y + height, 0);
 		sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight());
 
-		copy(renderTarget, sourceRect, sizedInternalFormat, 0, 0, 0, image[level]);
+		copy(renderTarget, sourceRect, 0, 0, 0, image[level]);
 	}
 
 	renderTarget->release();
@@ -769,7 +763,7 @@
 		sw::SliceRect sourceRect(x, y, x + width, y + height, 0);
 		sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight());
 
-		copy(renderTarget, sourceRect, image[level]->getFormat(), xoffset, yoffset, zoffset, image[level]);
+		copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[level]);
 
 		renderTarget->release();
 	}
@@ -1077,12 +1071,6 @@
 	return image[face][level] ? image[face][level]->getType() : 0;
 }
 
-sw::Format TextureCubeMap::getInternalFormat(GLenum target, GLint level) const
-{
-	int face = CubeFaceIndex(target);
-	return image[face][level] ? image[face][level]->getInternalFormat() : sw::FORMAT_NULL;
-}
-
 int TextureCubeMap::getLevelCount() const
 {
 	ASSERT(isSamplerComplete());
@@ -1105,7 +1093,7 @@
 		image[face][level]->release();
 	}
 
-	GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
+	GLint sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
 	int border = (egl::getClientVersion() >= 3) ? 1 : 0;
 	image[face][level] = egl::Image::create(this, width, height, 1, border, sizedInternalFormat, GL_UNSIGNED_BYTE);
 
@@ -1339,7 +1327,7 @@
 		image[face][level]->release();
 	}
 
-	GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
+	GLint sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
 	int border = (egl::getClientVersion() >= 3) ? 1 : 0;
 	image[face][level] = egl::Image::create(this, width, height, 1, border, sizedInternalFormat, GL_UNSIGNED_BYTE);
 
@@ -1361,7 +1349,7 @@
 		sw::SliceRect sourceRect(x, y, x + width, y + height, 0);
 		sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight());
 
-		copy(renderTarget, sourceRect, sizedInternalFormat, 0, 0, 0, image[face][level]);
+		copy(renderTarget, sourceRect, 0, 0, 0, image[face][level]);
 	}
 
 	renderTarget->release();
@@ -1414,7 +1402,7 @@
 		sw::SliceRect sourceRect(x, y, x + width, y + height, 0);
 		sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight());
 
-		copy(renderTarget, sourceRect, image[face][level]->getFormat(), xoffset, yoffset, zoffset, image[face][level]);
+		copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[face][level]);
 
 		renderTarget->release();
 	}
@@ -1614,12 +1602,6 @@
 	return image[level] ? image[level]->getType() : GL_NONE;
 }
 
-sw::Format Texture3D::getInternalFormat(GLenum target, GLint level) const
-{
-	ASSERT(target == getTarget());
-	return image[level] ? image[level]->getInternalFormat() : sw::FORMAT_NULL;
-}
-
 int Texture3D::getLevelCount() const
 {
 	ASSERT(isSamplerComplete());
@@ -1698,7 +1680,7 @@
 		image[level]->release();
 	}
 
-	GLenum sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
+	GLint sizedInternalFormat = GetSizedInternalFormat(format, GL_UNSIGNED_BYTE);
 	image[level] = egl::Image::create(this, width, height, depth, 0, sizedInternalFormat, GL_UNSIGNED_BYTE);
 
 	if(!image[level])
@@ -1720,7 +1702,7 @@
 		sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight());
 		for(GLint sliceZ = 0; sliceZ < depth; ++sliceZ, ++sourceRect.slice)
 		{
-			copy(renderTarget, sourceRect, sizedInternalFormat, 0, 0, sliceZ, image[level]);
+			copy(renderTarget, sourceRect, 0, 0, sliceZ, image[level]);
 		}
 	}
 
@@ -1760,7 +1742,7 @@
 		sw::SliceRect sourceRect = {x, y, x + width, y + height, 0};
 		sourceRect.clip(0, 0, renderbuffer->getWidth(), renderbuffer->getHeight());
 
-		copy(renderTarget, sourceRect, image[level]->getFormat(), xoffset, yoffset, zoffset, image[level]);
+		copy(renderTarget, sourceRect, xoffset, yoffset, zoffset, image[level]);
 
 		renderTarget->release();
 	}
diff --git a/src/OpenGL/libGLESv2/Texture.h b/src/OpenGL/libGLESv2/Texture.h
index d5e0c80..6d04c53 100644
--- a/src/OpenGL/libGLESv2/Texture.h
+++ b/src/OpenGL/libGLESv2/Texture.h
@@ -97,7 +97,6 @@
 	virtual GLsizei getDepth(GLenum target, GLint level) const;
 	virtual GLenum getFormat(GLenum target, GLint level) const = 0;
 	virtual GLenum getType(GLenum target, GLint level) const = 0;
-	virtual sw::Format getInternalFormat(GLenum target, GLint level) const = 0;
 	virtual int getLevelCount() const = 0;
 
 	virtual bool isSamplerComplete() const = 0;
@@ -120,7 +119,7 @@
 	void setCompressedImage(GLsizei imageSize, const void *pixels, egl::Image *image);
 	void subImageCompressed(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *pixels, egl::Image *image);
 
-	bool copy(egl::Image *source, const sw::SliceRect &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, GLint zoffset, egl::Image *dest);
+	bool copy(egl::Image *source, const sw::SliceRect &sourceRect, GLint xoffset, GLint yoffset, GLint zoffset, egl::Image *dest);
 
 	bool isMipmapFiltered() const;
 
@@ -161,7 +160,6 @@
 	GLsizei getHeight(GLenum target, GLint level) const override;
 	GLenum getFormat(GLenum target, GLint level) const override;
 	GLenum getType(GLenum target, GLint level) const override;
-	sw::Format getInternalFormat(GLenum target, GLint level) const override;
 	int getLevelCount() const override;
 
 	void setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
@@ -220,7 +218,6 @@
 	GLsizei getHeight(GLenum target, GLint level) const override;
 	GLenum getFormat(GLenum target, GLint level) const override;
 	GLenum getType(GLenum target, GLint level) const override;
-	sw::Format getInternalFormat(GLenum target, GLint level) const override;
 	int getLevelCount() const override;
 
 	void setImage(egl::Context *context, GLenum target, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
@@ -282,7 +279,6 @@
 	GLsizei getDepth(GLenum target, GLint level) const override;
 	GLenum getFormat(GLenum target, GLint level) const override;
 	GLenum getType(GLenum target, GLint level) const override;
-	sw::Format getInternalFormat(GLenum target, GLint level) const override;
 	int getLevelCount() const override;
 
 	void setImage(egl::Context *context, GLint level, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const egl::Image::UnpackInfo& unpackInfo, const void *pixels);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 08abb33..8f8ccdf 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -2285,7 +2285,7 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		if(!IsMipmappable(texture->getFormat(target, 0), texture->getInternalFormat(target, 0), clientVersion))
+		if(!IsMipmappable(texture->getFormat(target, 0), clientVersion))
 		{
 			return error(GL_INVALID_OPERATION);
 		}
@@ -3019,7 +3019,7 @@
 					return error(GL_INVALID_OPERATION);
 				}
 
-				*params = sw2es::GetComponentType(renderbuffer->getInternalFormat(), attachment);
+				*params = GetComponentType(renderbuffer->getFormat(), attachment);
 				break;
 			case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
 				if(clientVersion >= 3)
@@ -6319,7 +6319,7 @@
 		return error(GL_INVALID_ENUM);
 	}
 
-	if(internalformat != (GLint)format)
+	if(internalformat != format)
 	{
 		return error(GL_INVALID_OPERATION);
 	}
diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 612926a..2b5d038 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -33,19 +33,19 @@
 	// format and type combinations.
 
 	typedef std::pair<GLenum, GLenum> FormatTypePair;
-	typedef std::pair<FormatTypePair, GLenum> FormatPair;
+	typedef std::pair<FormatTypePair, GLint> FormatPair;
 	typedef std::map<FormatTypePair, GLenum> FormatMap;
 
 	// A helper function to insert data into the format map with fewer characters.
-	static inline void InsertFormatMapping(FormatMap *map, GLenum format, GLenum type, GLenum internalFormat)
+	static inline void InsertFormatMapping(FormatMap *map, GLenum format, GLenum type, GLint internalFormat)
 	{
 		map->insert(FormatPair(FormatTypePair(format, type), internalFormat));
 	}
 
 	FormatMap BuildFormatMap()
 	{
-		static const GLenum GL_BGRA4_ANGLEX = 0x6ABC;
-		static const GLenum GL_BGR5_A1_ANGLEX = 0x6ABD;
+		static const GLint GL_BGRA4_ANGLEX = 0x6ABC;
+		static const GLint GL_BGR5_A1_ANGLEX = 0x6ABD;
 
 		FormatMap map;
 
@@ -146,9 +146,9 @@
 		return map;
 	}
 
-	GLenum GetSizedInternalFormat(GLenum internalFormat, GLenum type)
+	GLint GetSizedInternalFormat(GLint internalformat, GLenum type)
 	{
-		switch(internalFormat)
+		switch(internalformat)
 		{
 		case GL_ALPHA:
 		case GL_LUMINANCE:
@@ -168,11 +168,11 @@
 		case GL_SRGB_ALPHA_EXT:
 			{
 				static const FormatMap formatMap = BuildFormatMap();
-				FormatMap::const_iterator iter = formatMap.find(FormatTypePair(internalFormat, type));
+				FormatMap::const_iterator iter = formatMap.find(FormatTypePair(internalformat, type));
 				return (iter != formatMap.end()) ? iter->second : GL_NONE;
 			}
 		default:
-			return internalFormat;
+			return internalformat;
 		}
 	}
 
@@ -648,9 +648,9 @@
 			return false;
 		}
 
-		sw::Format internalformat = colorbuffer->getInternalFormat();
+		GLint internalformat = colorbuffer->getFormat();
 
-		if(sw::Surface::isNormalizedInteger(internalformat))
+		if(IsNormalizedInteger(internalformat))
 		{
 			// Combination always supported by normalized fixed-point rendering surfaces.
 			if(format == GL_RGBA && type == GL_UNSIGNED_BYTE)
@@ -669,7 +669,7 @@
 				}
 			}
 		}
-		else if(sw::Surface::isFloatFormat(internalformat))
+		else if(IsFloatFormat(internalformat))
 		{
 			// Combination always supported by floating-point rendering surfaces.
 			// Supported in OpenGL ES 2.0 due to GL_EXT_color_buffer_half_float.
@@ -678,7 +678,7 @@
 				return true;
 			}
 		}
-		else if(sw::Surface::isSignedNonNormalizedInteger(internalformat))
+		else if(IsSignedNonNormalizedInteger(internalformat))
 		{
 			ASSERT(clientVersion >= 3);
 
@@ -687,7 +687,7 @@
 				return true;
 			}
 		}
-		else if(sw::Surface::isUnsignedNonNormalizedInteger(internalformat))
+		else if(IsUnsignedNonNormalizedInteger(internalformat))
 		{
 			ASSERT(clientVersion >= 3);
 
@@ -897,8 +897,8 @@
 			case GL_RGBA4:
 			case GL_RGB5_A1:
 			case GL_RGB565:
-			case GL_RGB8_OES:
-			case GL_RGBA8_OES:
+			case GL_RGB8:
+			case GL_RGBA8:
 			case GL_R16F:
 			case GL_RG16F:
 			case GL_R11F_G11F_B10F:
@@ -1238,8 +1238,8 @@
 		case GL_RGBA4:
 		case GL_RGB5_A1:
 		case GL_RGB565:
-		case GL_RGB8_OES:
-		case GL_RGBA8_OES:
+		case GL_RGB8:
+		case GL_RGBA8:
 		case GL_RED:
 		case GL_RG:
 		case GL_RGB:
@@ -1300,8 +1300,8 @@
 		case GL_RGBA4:
 		case GL_RGB5_A1:
 		case GL_RGB565:
-		case GL_RGB8_OES:
-		case GL_RGBA8_OES:
+		case GL_RGB8:
+		case GL_RGBA8:
 		case GL_RED:
 		case GL_RG:
 		case GL_RGB:
@@ -1331,9 +1331,9 @@
 		return false;
 	}
 
-	bool IsMipmappable(GLint internalformat, sw::Format format, GLint clientVersion)
+	bool IsMipmappable(GLint internalformat, GLint clientVersion)
 	{
-		if(sw::Surface::isNonNormalizedInteger(format))
+		if(IsNonNormalizedInteger(internalformat))
 		{
 			return false;
 		}
@@ -1349,6 +1349,376 @@
 		}
 	}
 
+	GLuint GetAlphaSize(GLint internalformat)
+	{
+		switch(internalformat)
+		{
+		case GL_RGBA4:          return 4;
+		case GL_RGB5_A1:        return 1;
+		case GL_RGB565:         return 0;
+		case GL_R8:             return 0;
+		case GL_RG8:            return 0;
+		case GL_RGB8:           return 0;
+		case GL_RGBA8:          return 8;
+		case GL_R16F:           return 0;
+		case GL_RG16F:          return 0;
+		case GL_RGB16F:         return 0;
+		case GL_RGBA16F:        return 16;
+		case GL_R32F:           return 0;
+		case GL_RG32F:          return 0;
+		case GL_RGB32F:         return 0;
+		case GL_RGBA32F:        return 32;
+		case GL_BGRA8_EXT:      return 8;
+		case GL_R8UI:           return 0;
+		case GL_R8I:            return 0;
+		case GL_R16UI:          return 0;
+		case GL_R16I:           return 0;
+		case GL_R32UI:          return 0;
+		case GL_R32I:           return 0;
+		case GL_RG8UI:          return 0;
+		case GL_RG8I:           return 0;
+		case GL_RG16UI:         return 0;
+		case GL_RG16I:          return 0;
+		case GL_RG32UI:         return 0;
+		case GL_RG32I:          return 0;
+		case GL_SRGB8_ALPHA8:   return 8;
+		case GL_RGB10_A2:       return 2;
+		case GL_RGBA8UI:        return 8;
+		case GL_RGBA8I:         return 8;
+		case GL_RGB10_A2UI:     return 2;
+		case GL_RGBA16UI:       return 16;
+		case GL_RGBA16I:        return 16;
+		case GL_RGBA32I:        return 32;
+		case GL_RGBA32UI:       return 32;
+		case GL_R11F_G11F_B10F: return 0;
+		default:
+			UNREACHABLE(internalformat);
+			return 0;
+		}
+	}
+
+	GLuint GetRedSize(GLint internalformat)
+	{
+		switch(internalformat)
+		{
+		case GL_RGBA4:          return 4;
+		case GL_RGB5_A1:        return 5;
+		case GL_RGB565:         return 5;
+		case GL_R8:             return 8;
+		case GL_RG8:            return 8;
+		case GL_RGB8:           return 8;
+		case GL_RGBA8:          return 8;
+		case GL_R16F:           return 16;
+		case GL_RG16F:          return 16;
+		case GL_RGB16F:         return 16;
+		case GL_RGBA16F:        return 16;
+		case GL_R32F:           return 32;
+		case GL_RG32F:          return 32;
+		case GL_RGB32F:         return 32;
+		case GL_RGBA32F:        return 32;
+		case GL_BGRA8_EXT:      return 8;
+		case GL_R8UI:           return 8;
+		case GL_R8I:            return 8;
+		case GL_R16UI:          return 16;
+		case GL_R16I:           return 16;
+		case GL_R32UI:          return 32;
+		case GL_R32I:           return 32;
+		case GL_RG8UI:          return 8;
+		case GL_RG8I:           return 8;
+		case GL_RG16UI:         return 16;
+		case GL_RG16I:          return 16;
+		case GL_RG32UI:         return 32;
+		case GL_RG32I:          return 32;
+		case GL_SRGB8_ALPHA8:   return 8;
+		case GL_RGB10_A2:       return 10;
+		case GL_RGBA8UI:        return 8;
+		case GL_RGBA8I:         return 8;
+		case GL_RGB10_A2UI:     return 10;
+		case GL_RGBA16UI:       return 16;
+		case GL_RGBA16I:        return 16;
+		case GL_RGBA32I:        return 32;
+		case GL_RGBA32UI:       return 32;
+		case GL_R11F_G11F_B10F: return 11;
+		default:
+			UNREACHABLE(internalformat);
+			return 0;
+		}
+	}
+
+	GLuint GetGreenSize(GLint internalformat)
+	{
+		switch(internalformat)
+		{
+		case GL_RGBA4:          return 4;
+		case GL_RGB5_A1:        return 5;
+		case GL_RGB565:         return 6;
+		case GL_R8:             return 0;
+		case GL_RG8:            return 8;
+		case GL_RGB8:           return 8;
+		case GL_RGBA8:          return 8;
+		case GL_R16F:           return 0;
+		case GL_RG16F:          return 16;
+		case GL_RGB16F:         return 16;
+		case GL_RGBA16F:        return 16;
+		case GL_R32F:           return 0;
+		case GL_RG32F:          return 32;
+		case GL_RGB32F:         return 32;
+		case GL_RGBA32F:        return 32;
+		case GL_BGRA8_EXT:      return 8;
+		case GL_R8UI:           return 0;
+		case GL_R8I:            return 0;
+		case GL_R16UI:          return 0;
+		case GL_R16I:           return 0;
+		case GL_R32UI:          return 0;
+		case GL_R32I:           return 0;
+		case GL_RG8UI:          return 8;
+		case GL_RG8I:           return 8;
+		case GL_RG16UI:         return 16;
+		case GL_RG16I:          return 16;
+		case GL_RG32UI:         return 32;
+		case GL_RG32I:          return 32;
+		case GL_SRGB8_ALPHA8:   return 8;
+		case GL_RGB10_A2:       return 10;
+		case GL_RGBA8UI:        return 8;
+		case GL_RGBA8I:         return 8;
+		case GL_RGB10_A2UI:     return 10;
+		case GL_RGBA16UI:       return 16;
+		case GL_RGBA16I:        return 16;
+		case GL_RGBA32I:        return 32;
+		case GL_RGBA32UI:       return 32;
+		case GL_R11F_G11F_B10F: return 11;
+		default:
+			UNREACHABLE(internalformat);
+			return 0;
+		}
+	}
+
+	GLuint GetBlueSize(GLint internalformat)
+	{
+		switch(internalformat)
+		{
+		case GL_RGBA4:          return 4;
+		case GL_RGB5_A1:        return 5;
+		case GL_RGB565:         return 5;
+		case GL_R8:             return 0;
+		case GL_RG8:            return 0;
+		case GL_RGB8:           return 8;
+		case GL_RGBA8:          return 8;
+		case GL_R16F:           return 0;
+		case GL_RG16F:          return 0;
+		case GL_RGB16F:         return 16;
+		case GL_RGBA16F:        return 16;
+		case GL_R32F:           return 0;
+		case GL_RG32F:          return 0;
+		case GL_RGB32F:         return 32;
+		case GL_RGBA32F:        return 32;
+		case GL_BGRA8_EXT:      return 8;
+		case GL_R8UI:           return 0;
+		case GL_R8I:            return 0;
+		case GL_R16UI:          return 0;
+		case GL_R16I:           return 0;
+		case GL_R32UI:          return 0;
+		case GL_R32I:           return 0;
+		case GL_RG8UI:          return 0;
+		case GL_RG8I:           return 0;
+		case GL_RG16UI:         return 0;
+		case GL_RG16I:          return 0;
+		case GL_RG32UI:         return 0;
+		case GL_RG32I:          return 0;
+		case GL_SRGB8_ALPHA8:   return 8;
+		case GL_RGB10_A2:       return 10;
+		case GL_RGBA8UI:        return 8;
+		case GL_RGBA8I:         return 8;
+		case GL_RGB10_A2UI:     return 10;
+		case GL_RGBA16UI:       return 16;
+		case GL_RGBA16I:        return 16;
+		case GL_RGBA32I:        return 32;
+		case GL_RGBA32UI:       return 32;
+		case GL_R11F_G11F_B10F: return 10;
+		default:
+			UNREACHABLE(internalformat);
+			return 0;
+		}
+	}
+
+	GLuint GetDepthSize(GLint internalformat)
+	{
+		switch(internalformat)
+		{
+		case GL_STENCIL_INDEX8:        return 0;
+		case GL_DEPTH_COMPONENT16:     return 16;
+		case GL_DEPTH_COMPONENT24:     return 24;
+		case GL_DEPTH_COMPONENT32_OES: return 32;
+		case GL_DEPTH_COMPONENT32F:    return 32;
+		case GL_DEPTH24_STENCIL8:      return 24;
+		case GL_DEPTH32F_STENCIL8:     return 32;
+		default:
+			UNREACHABLE(internalformat);
+			return 0;
+		}
+	}
+
+	GLuint GetStencilSize(GLint internalformat)
+	{
+		switch(internalformat)
+		{
+		case GL_STENCIL_INDEX8:        return 8;
+		case GL_DEPTH_COMPONENT16:     return 0;
+		case GL_DEPTH_COMPONENT24:     return 0;
+		case GL_DEPTH_COMPONENT32_OES: return 0;
+		case GL_DEPTH_COMPONENT32F:    return 0;
+		case GL_DEPTH24_STENCIL8:      return 8;
+		case GL_DEPTH32F_STENCIL8:     return 8;
+		default:
+			UNREACHABLE(internalformat);
+			return 0;
+		}
+	}
+
+	GLenum GetColorComponentType(GLint internalformat)
+	{
+		switch(internalformat)
+		{
+		case GL_ALPHA8_EXT:
+		case GL_LUMINANCE8_ALPHA8_EXT:
+		case GL_LUMINANCE8_EXT:
+		case GL_R8:
+		case GL_RG8:
+		case GL_SRGB8_ALPHA8:
+		case GL_RGB10_A2:
+		case GL_RGBA4:
+		case GL_RGB5_A1:
+		case GL_RGB565:
+		case GL_RGB8:
+		case GL_RGBA8:
+		case GL_SRGB8:
+			return GL_UNSIGNED_NORMALIZED;
+		case GL_R8_SNORM:
+		case GL_RG8_SNORM:
+		case GL_RGB8_SNORM:
+		case GL_RGBA8_SNORM:
+			return GL_SIGNED_NORMALIZED;
+		case GL_R8UI:
+		case GL_R16UI:
+		case GL_R32UI:
+		case GL_RG8UI:
+		case GL_RG16UI:
+		case GL_RG32UI:
+		case GL_RGB8UI:
+		case GL_RGB16UI:
+		case GL_RGB32UI:
+		case GL_RGB10_A2UI:
+		case GL_RGBA16UI:
+		case GL_RGBA32UI:
+		case GL_RGBA8UI:
+			return GL_UNSIGNED_INT;
+		case GL_R8I:
+		case GL_R16I:
+		case GL_R32I:
+		case GL_RG8I:
+		case GL_RG16I:
+		case GL_RG32I:
+		case GL_RGB8I:
+		case GL_RGB16I:
+		case GL_RGB32I:
+		case GL_RGBA8I:
+		case GL_RGBA16I:
+		case GL_RGBA32I:
+			return GL_INT;
+		case GL_R16F:
+		case GL_RG16F:
+		case GL_R11F_G11F_B10F:
+		case GL_RGB16F:
+		case GL_RGBA16F:
+		case GL_R32F:
+		case GL_RG32F:
+		case GL_RGB32F:
+		case GL_RGBA32F:
+		case GL_RGB9_E5:
+			return GL_FLOAT;
+		default:
+			UNREACHABLE(internalformat);
+			return GL_NONE;
+		}
+	}
+
+	GLenum GetComponentType(GLint internalformat, GLenum attachment)
+	{
+		// Can be one of GL_FLOAT, GL_INT, GL_UNSIGNED_INT, GL_SIGNED_NORMALIZED, or GL_UNSIGNED_NORMALIZED
+		switch(attachment)
+		{
+		case GL_COLOR_ATTACHMENT0:
+		case GL_COLOR_ATTACHMENT1:
+		case GL_COLOR_ATTACHMENT2:
+		case GL_COLOR_ATTACHMENT3:
+		case GL_COLOR_ATTACHMENT4:
+		case GL_COLOR_ATTACHMENT5:
+		case GL_COLOR_ATTACHMENT6:
+		case GL_COLOR_ATTACHMENT7:
+		case GL_COLOR_ATTACHMENT8:
+		case GL_COLOR_ATTACHMENT9:
+		case GL_COLOR_ATTACHMENT10:
+		case GL_COLOR_ATTACHMENT11:
+		case GL_COLOR_ATTACHMENT12:
+		case GL_COLOR_ATTACHMENT13:
+		case GL_COLOR_ATTACHMENT14:
+		case GL_COLOR_ATTACHMENT15:
+		case GL_COLOR_ATTACHMENT16:
+		case GL_COLOR_ATTACHMENT17:
+		case GL_COLOR_ATTACHMENT18:
+		case GL_COLOR_ATTACHMENT19:
+		case GL_COLOR_ATTACHMENT20:
+		case GL_COLOR_ATTACHMENT21:
+		case GL_COLOR_ATTACHMENT22:
+		case GL_COLOR_ATTACHMENT23:
+		case GL_COLOR_ATTACHMENT24:
+		case GL_COLOR_ATTACHMENT25:
+		case GL_COLOR_ATTACHMENT26:
+		case GL_COLOR_ATTACHMENT27:
+		case GL_COLOR_ATTACHMENT28:
+		case GL_COLOR_ATTACHMENT29:
+		case GL_COLOR_ATTACHMENT30:
+		case GL_COLOR_ATTACHMENT31:
+			return GetColorComponentType(internalformat);
+		case GL_DEPTH_ATTACHMENT:
+		case GL_STENCIL_ATTACHMENT:
+			// Only color buffers may have integer components.
+			return GL_FLOAT;
+		default:
+			UNREACHABLE(attachment);
+			return GL_NONE;
+		}
+	}
+
+	bool IsNormalizedInteger(GLint internalformat)
+	{
+		GLenum type = GetColorComponentType(internalformat);
+
+		return type == GL_UNSIGNED_NORMALIZED || type == GL_SIGNED_NORMALIZED;
+	}
+
+	bool IsNonNormalizedInteger(GLint internalformat)
+	{
+		GLenum type = GetColorComponentType(internalformat);
+
+		return type == GL_UNSIGNED_INT || type == GL_INT;
+	}
+
+	bool IsFloatFormat(GLint internalformat)
+	{
+		return GetColorComponentType(internalformat) == GL_FLOAT;
+	}
+
+	bool IsSignedNonNormalizedInteger(GLint internalformat)
+	{
+		return GetColorComponentType(internalformat) == GL_INT;
+	}
+
+	bool IsUnsignedNonNormalizedInteger(GLint internalformat)
+	{
+		return GetColorComponentType(internalformat) == GL_UNSIGNED_INT;
+	}
+
 	std::string ParseUniformName(const std::string &name, unsigned int *outSubscript)
 	{
 		// Strip any trailing array operator and retrieve the subscript
@@ -1678,9 +2048,9 @@
 		{
 		case GL_RGBA4:
 		case GL_RGB5_A1:
-		case GL_RGBA8_OES:            return sw::FORMAT_A8B8G8R8;
+		case GL_RGBA8:                return sw::FORMAT_A8B8G8R8;
 		case GL_RGB565:               return sw::FORMAT_R5G6B5;
-		case GL_RGB8_OES:             return sw::FORMAT_X8B8G8R8;
+		case GL_RGB8:                 return sw::FORMAT_X8B8G8R8;
 		case GL_DEPTH_COMPONENT16:
 		case GL_DEPTH_COMPONENT24:
 		case GL_STENCIL_INDEX8:
@@ -1732,391 +2102,19 @@
 
 namespace sw2es
 {
-	unsigned int GetStencilSize(sw::Format stencilFormat)
-	{
-		switch(stencilFormat)
-		{
-		case sw::FORMAT_NULL:
-			return 0;
-		case sw::FORMAT_D24FS8:
-		case sw::FORMAT_D24S8:
-		case sw::FORMAT_D32FS8_TEXTURE:
-		case sw::FORMAT_D32FS8_SHADOW:
-		case sw::FORMAT_S8:
-			return 8;
-	//	case sw::FORMAT_D24X4S4:
-	//		return 4;
-	//	case sw::FORMAT_D15S1:
-	//		return 1;
-	//	case sw::FORMAT_D16_LOCKABLE:
-		case sw::FORMAT_D32:
-		case sw::FORMAT_D24X8:
-		case sw::FORMAT_D32F_LOCKABLE:
-		case sw::FORMAT_D16:
-			return 0;
-	//	case sw::FORMAT_D32_LOCKABLE:  return 0;
-	//	case sw::FORMAT_S8_LOCKABLE:   return 8;
-		default:
-			UNREACHABLE(stencilFormat);
-			return 0;
-		}
-	}
-
-	unsigned int GetAlphaSize(sw::Format colorFormat)
-	{
-		switch(colorFormat)
-		{
-		case sw::FORMAT_NULL:
-			return 0;
-		case sw::FORMAT_A16B16G16R16F:
-		case sw::FORMAT_A16B16G16R16I:
-		case sw::FORMAT_A16B16G16R16UI:
-			return 16;
-		case sw::FORMAT_A32B32G32R32F:
-		case sw::FORMAT_A32B32G32R32I:
-		case sw::FORMAT_A32B32G32R32UI:
-			return 32;
-		case sw::FORMAT_A2R10G10B10:
-			return 2;
-		case sw::FORMAT_A8R8G8B8:
-		case sw::FORMAT_A8B8G8R8:
-		case sw::FORMAT_SRGB8_A8:
-		case sw::FORMAT_A8B8G8R8I:
-		case sw::FORMAT_A8B8G8R8UI:
-		case sw::FORMAT_A8B8G8R8I_SNORM:
-			return 8;
-		case sw::FORMAT_A2B10G10R10:
-			return 2;
-		case sw::FORMAT_A1R5G5B5:
-			return 1;
-		case sw::FORMAT_X8R8G8B8:
-		case sw::FORMAT_X8B8G8R8:
-		case sw::FORMAT_SRGB8_X8:
-		case sw::FORMAT_R5G6B5:
-			return 0;
-		default:
-			UNREACHABLE(colorFormat);
-			return 0;
-		}
-	}
-
-	unsigned int GetRedSize(sw::Format colorFormat)
-	{
-		switch(colorFormat)
-		{
-		case sw::FORMAT_NULL:
-			return 0;
-		case sw::FORMAT_R16F:
-		case sw::FORMAT_G16R16F:
-		case sw::FORMAT_B16G16R16F:
-		case sw::FORMAT_A16B16G16R16F:
-		case sw::FORMAT_R16I:
-		case sw::FORMAT_G16R16I:
-		case sw::FORMAT_X16B16G16R16I:
-		case sw::FORMAT_A16B16G16R16I:
-		case sw::FORMAT_R16UI:
-		case sw::FORMAT_G16R16UI:
-		case sw::FORMAT_X16B16G16R16UI:
-		case sw::FORMAT_A16B16G16R16UI:
-			return 16;
-		case sw::FORMAT_R32F:
-		case sw::FORMAT_G32R32F:
-		case sw::FORMAT_B32G32R32F:
-		case sw::FORMAT_X32B32G32R32F:
-		case sw::FORMAT_A32B32G32R32F:
-		case sw::FORMAT_R32I:
-		case sw::FORMAT_G32R32I:
-		case sw::FORMAT_X32B32G32R32I:
-		case sw::FORMAT_A32B32G32R32I:
-		case sw::FORMAT_R32UI:
-		case sw::FORMAT_G32R32UI:
-		case sw::FORMAT_X32B32G32R32UI:
-		case sw::FORMAT_A32B32G32R32UI:
-			return 32;
-		case sw::FORMAT_A2B10G10R10:
-		case sw::FORMAT_A2R10G10B10:
-			return 10;
-		case sw::FORMAT_A8R8G8B8:
-		case sw::FORMAT_A8B8G8R8:
-		case sw::FORMAT_X8R8G8B8:
-		case sw::FORMAT_X8B8G8R8:
-		case sw::FORMAT_SRGB8_A8:
-		case sw::FORMAT_SRGB8_X8:
-		case sw::FORMAT_R8:
-		case sw::FORMAT_G8R8:
-		case sw::FORMAT_R8I:
-		case sw::FORMAT_G8R8I:
-		case sw::FORMAT_X8B8G8R8I:
-		case sw::FORMAT_A8B8G8R8I:
-		case sw::FORMAT_R8UI:
-		case sw::FORMAT_G8R8UI:
-		case sw::FORMAT_X8B8G8R8UI:
-		case sw::FORMAT_A8B8G8R8UI:
-		case sw::FORMAT_R8I_SNORM:
-		case sw::FORMAT_G8R8I_SNORM:
-		case sw::FORMAT_X8B8G8R8I_SNORM:
-		case sw::FORMAT_A8B8G8R8I_SNORM:
-			return 8;
-		case sw::FORMAT_A1R5G5B5:
-		case sw::FORMAT_R5G6B5:
-			return 5;
-		default:
-			UNREACHABLE(colorFormat);
-			return 0;
-		}
-	}
-
-	unsigned int GetGreenSize(sw::Format colorFormat)
-	{
-		switch(colorFormat)
-		{
-		case sw::FORMAT_NULL:
-			return 0;
-		case sw::FORMAT_G16R16F:
-		case sw::FORMAT_B16G16R16F:
-		case sw::FORMAT_A16B16G16R16F:
-		case sw::FORMAT_G16R16I:
-		case sw::FORMAT_X16B16G16R16I:
-		case sw::FORMAT_A16B16G16R16I:
-		case sw::FORMAT_G16R16UI:
-		case sw::FORMAT_X16B16G16R16UI:
-		case sw::FORMAT_A16B16G16R16UI:
-			return 16;
-		case sw::FORMAT_G32R32F:
-		case sw::FORMAT_B32G32R32F:
-		case sw::FORMAT_X32B32G32R32F:
-		case sw::FORMAT_A32B32G32R32F:
-		case sw::FORMAT_G32R32I:
-		case sw::FORMAT_X32B32G32R32I:
-		case sw::FORMAT_A32B32G32R32I:
-		case sw::FORMAT_G32R32UI:
-		case sw::FORMAT_X32B32G32R32UI:
-		case sw::FORMAT_A32B32G32R32UI:
-			return 32;
-		case sw::FORMAT_A2B10G10R10:
-		case sw::FORMAT_A2R10G10B10:
-			return 10;
-		case sw::FORMAT_A8R8G8B8:
-		case sw::FORMAT_A8B8G8R8:
-		case sw::FORMAT_X8R8G8B8:
-		case sw::FORMAT_X8B8G8R8:
-		case sw::FORMAT_SRGB8_A8:
-		case sw::FORMAT_SRGB8_X8:
-		case sw::FORMAT_G8R8:
-		case sw::FORMAT_G8R8I:
-		case sw::FORMAT_X8B8G8R8I:
-		case sw::FORMAT_A8B8G8R8I:
-		case sw::FORMAT_G8R8UI:
-		case sw::FORMAT_X8B8G8R8UI:
-		case sw::FORMAT_A8B8G8R8UI:
-		case sw::FORMAT_G8R8I_SNORM:
-		case sw::FORMAT_X8B8G8R8I_SNORM:
-		case sw::FORMAT_A8B8G8R8I_SNORM:
-			return 8;
-		case sw::FORMAT_A1R5G5B5:
-			return 5;
-		case sw::FORMAT_R5G6B5:
-			return 6;
-		default:
-			UNREACHABLE(colorFormat);
-			return 0;
-		}
-	}
-
-	unsigned int GetBlueSize(sw::Format colorFormat)
-	{
-		switch(colorFormat)
-		{
-		case sw::FORMAT_NULL:
-			return 0;
-		case sw::FORMAT_B16G16R16F:
-		case sw::FORMAT_A16B16G16R16F:
-		case sw::FORMAT_X16B16G16R16I:
-		case sw::FORMAT_A16B16G16R16I:
-		case sw::FORMAT_X16B16G16R16UI:
-		case sw::FORMAT_A16B16G16R16UI:
-			return 16;
-		case sw::FORMAT_B32G32R32F:
-		case sw::FORMAT_X32B32G32R32F:
-		case sw::FORMAT_A32B32G32R32F:
-		case sw::FORMAT_X32B32G32R32I:
-		case sw::FORMAT_A32B32G32R32I:
-		case sw::FORMAT_X32B32G32R32UI:
-		case sw::FORMAT_A32B32G32R32UI:
-			return 32;
-		case sw::FORMAT_A2B10G10R10:
-		case sw::FORMAT_A2R10G10B10:
-			return 10;
-		case sw::FORMAT_A8R8G8B8:
-		case sw::FORMAT_A8B8G8R8:
-		case sw::FORMAT_X8R8G8B8:
-		case sw::FORMAT_X8B8G8R8:
-		case sw::FORMAT_SRGB8_A8:
-		case sw::FORMAT_SRGB8_X8:
-		case sw::FORMAT_X8B8G8R8I:
-		case sw::FORMAT_A8B8G8R8I:
-		case sw::FORMAT_X8B8G8R8UI:
-		case sw::FORMAT_A8B8G8R8UI:
-		case sw::FORMAT_X8B8G8R8I_SNORM:
-		case sw::FORMAT_A8B8G8R8I_SNORM:
-			return 8;
-		case sw::FORMAT_A1R5G5B5:
-		case sw::FORMAT_R5G6B5:
-			return 5;
-		default:
-			UNREACHABLE(colorFormat);
-			return 0;
-		}
-	}
-
-	unsigned int GetDepthSize(sw::Format depthFormat)
-	{
-		switch(depthFormat)
-		{
-		case sw::FORMAT_NULL:           return 0;
-	//	case sw::FORMAT_D16_LOCKABLE:   return 16;
-		case sw::FORMAT_D32:            return 32;
-	//	case sw::FORMAT_D15S1:          return 15;
-		case sw::FORMAT_D24S8:          return 24;
-		case sw::FORMAT_D24X8:          return 24;
-	//	case sw::FORMAT_D24X4S4:        return 24;
-		case sw::FORMAT_DF16S8:
-		case sw::FORMAT_D16:            return 16;
-		case sw::FORMAT_D32F:
-		case sw::FORMAT_D32F_COMPLEMENTARY:
-		case sw::FORMAT_D32F_LOCKABLE:  return 32;
-		case sw::FORMAT_DF24S8:
-		case sw::FORMAT_D24FS8:         return 24;
-	//	case sw::FORMAT_D32_LOCKABLE:   return 32;
-	//	case sw::FORMAT_S8_LOCKABLE:    return 0;
-		case sw::FORMAT_D32FS8_SHADOW:
-		case sw::FORMAT_D32FS8_TEXTURE: return 32;
-		default:
-			UNREACHABLE(depthFormat);
-			return 0;
-		}
-	}
-
-	GLenum GetComponentType(sw::Format format, GLenum attachment)
-	{
-		// Can be one of GL_FLOAT, GL_INT, GL_UNSIGNED_INT, GL_SIGNED_NORMALIZED, or GL_UNSIGNED_NORMALIZED
-		switch(attachment)
-		{
-		case GL_COLOR_ATTACHMENT0:
-		case GL_COLOR_ATTACHMENT1:
-		case GL_COLOR_ATTACHMENT2:
-		case GL_COLOR_ATTACHMENT3:
-		case GL_COLOR_ATTACHMENT4:
-		case GL_COLOR_ATTACHMENT5:
-		case GL_COLOR_ATTACHMENT6:
-		case GL_COLOR_ATTACHMENT7:
-		case GL_COLOR_ATTACHMENT8:
-		case GL_COLOR_ATTACHMENT9:
-		case GL_COLOR_ATTACHMENT10:
-		case GL_COLOR_ATTACHMENT11:
-		case GL_COLOR_ATTACHMENT12:
-		case GL_COLOR_ATTACHMENT13:
-		case GL_COLOR_ATTACHMENT14:
-		case GL_COLOR_ATTACHMENT15:
-		case GL_COLOR_ATTACHMENT16:
-		case GL_COLOR_ATTACHMENT17:
-		case GL_COLOR_ATTACHMENT18:
-		case GL_COLOR_ATTACHMENT19:
-		case GL_COLOR_ATTACHMENT20:
-		case GL_COLOR_ATTACHMENT21:
-		case GL_COLOR_ATTACHMENT22:
-		case GL_COLOR_ATTACHMENT23:
-		case GL_COLOR_ATTACHMENT24:
-		case GL_COLOR_ATTACHMENT25:
-		case GL_COLOR_ATTACHMENT26:
-		case GL_COLOR_ATTACHMENT27:
-		case GL_COLOR_ATTACHMENT28:
-		case GL_COLOR_ATTACHMENT29:
-		case GL_COLOR_ATTACHMENT30:
-		case GL_COLOR_ATTACHMENT31:
-			switch(format)
-			{
-			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_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_R8:
-			case sw::FORMAT_G8R8:
-			case sw::FORMAT_A2B10G10R10:
-			case sw::FORMAT_A2R10G10B10:
-			case sw::FORMAT_A8R8G8B8:
-			case sw::FORMAT_A8B8G8R8:
-			case sw::FORMAT_X8R8G8B8:
-			case sw::FORMAT_X8B8G8R8:
-			case sw::FORMAT_SRGB8_A8:
-			case sw::FORMAT_SRGB8_X8:
-			case sw::FORMAT_A1R5G5B5:
-			case sw::FORMAT_R5G6B5:
-				return GL_UNSIGNED_NORMALIZED;
-			case sw::FORMAT_R8I_SNORM:
-			case sw::FORMAT_X8B8G8R8I_SNORM:
-			case sw::FORMAT_A8B8G8R8I_SNORM:
-			case sw::FORMAT_G8R8I_SNORM:
-				return GL_SIGNED_NORMALIZED;
-			default:
-				UNREACHABLE(format);
-				return GL_NONE;
-			}
-		case GL_DEPTH_ATTACHMENT:
-		case GL_STENCIL_ATTACHMENT:
-			// Only color buffers may have integer components.
-			return GL_FLOAT;
-		default:
-			UNREACHABLE(attachment);
-			return GL_NONE;
-		}
-	}
-
 	GLenum ConvertBackBufferFormat(sw::Format format)
 	{
 		switch(format)
 		{
 		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_A8R8G8B8: return GL_RGBA8;
+		case sw::FORMAT_A8B8G8R8: return GL_RGBA8;
 		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;
-		case sw::FORMAT_SRGB8_A8: return GL_RGBA8_OES;
-		case sw::FORMAT_SRGB8_X8: return GL_RGB8_OES;
+		case sw::FORMAT_X8R8G8B8: return GL_RGB8;
+		case sw::FORMAT_X8B8G8R8: return GL_RGB8;
+		case sw::FORMAT_SRGB8_A8: return GL_RGBA8;
+		case sw::FORMAT_SRGB8_X8: return GL_RGB8;
 		default:
 			UNREACHABLE(format);
 		}
@@ -2149,4 +2147,4 @@
 
 		return GL_DEPTH24_STENCIL8_OES;
 	}
-}
+}
\ No newline at end of file
diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h
index 7240999..6156097 100644
--- a/src/OpenGL/libGLESv2/utilities.h
+++ b/src/OpenGL/libGLESv2/utilities.h
@@ -43,7 +43,7 @@
 	int AllocateFirstFreeBits(unsigned int *bits, unsigned int allocationSize, unsigned int bitsSize);
 
 	bool IsCompressed(GLenum format, GLint clientVersion);
-	GLenum GetSizedInternalFormat(GLenum internalFormat, GLenum type);
+	GLint GetSizedInternalFormat(GLint internalFormat, GLenum type);
 	GLenum ValidateCompressedFormat(GLenum format, GLint clientVersion, bool expectCompressedFormats);
 	GLenum ValidateSubImageParams(bool compressed, bool copy, GLenum target, GLint level, GLint xoffset, GLint yoffset,
 	                              GLsizei width, GLsizei height, GLenum format, GLenum type, Texture *texture, GLint clientVersion);
@@ -61,7 +61,22 @@
 	bool IsColorRenderable(GLint internalformat, GLint clientVersion);
 	bool IsDepthRenderable(GLint internalformat, GLint clientVersion);
 	bool IsStencilRenderable(GLint internalformat, GLint clientVersion);
-	bool IsMipmappable(GLint internalformat, sw::Format format, GLint clientVersion);
+	bool IsMipmappable(GLint internalformat, GLint clientVersion);
+
+	GLuint GetAlphaSize(GLint internalformat);
+	GLuint GetRedSize(GLint internalformat);
+	GLuint GetGreenSize(GLint internalformat);
+	GLuint GetBlueSize(GLint internalformat);
+	GLuint GetDepthSize(GLint internalformat);
+	GLuint GetStencilSize(GLint internalformat);
+
+	GLenum GetColorComponentType(GLint internalformat);
+	GLenum GetComponentType(GLint internalformat, GLenum attachment);
+	bool IsNormalizedInteger(GLint internalformat);
+	bool IsNonNormalizedInteger(GLint internalformat);
+	bool IsFloatFormat(GLint internalformat);
+	bool IsSignedNonNormalizedInteger(GLint internalformat);
+	bool IsUnsignedNonNormalizedInteger(GLint internalformat);
 
 	// Parse the base uniform name and array index.  Returns the base name of the uniform. outSubscript is
 	// set to GL_INVALID_INDEX if the provided name is not an array or the array index is invalid.
@@ -90,14 +105,6 @@
 
 namespace sw2es
 {
-	GLuint GetAlphaSize(sw::Format colorFormat);
-	GLuint GetRedSize(sw::Format colorFormat);
-	GLuint GetGreenSize(sw::Format colorFormat);
-	GLuint GetBlueSize(sw::Format colorFormat);
-	GLuint GetDepthSize(sw::Format depthFormat);
-	GLuint GetStencilSize(sw::Format stencilFormat);
-	GLenum GetComponentType(sw::Format format, GLenum attachment);
-
 	GLenum ConvertBackBufferFormat(sw::Format format);
 	GLenum ConvertDepthStencilFormat(sw::Format format);
 }