diff --git a/src/OpenGL/common/Image.cpp b/src/OpenGL/common/Image.cpp
index bf14e12..09f52d0 100644
--- a/src/OpenGL/common/Image.cpp
+++ b/src/OpenGL/common/Image.cpp
@@ -906,192 +906,107 @@
 		return sw::FORMAT_NULL;
 	}
 
-	// Returns the size, in bytes, of a single texel in an Image
+	// Returns the size, in bytes, of a single client-side pixel.
+    // OpenGL ES 3.0.5 table 3.2.
 	static int ComputePixelSize(GLenum format, GLenum type)
 	{
-		switch(type)
+		switch(format)
 		{
-		case GL_BYTE:
-			switch(format)
+		case GL_RED:
+		case GL_RED_INTEGER:
+		case GL_ALPHA:
+		case GL_LUMINANCE:
+			switch(type)
 			{
-			case GL_R8:
-			case GL_R8I:
-			case GL_R8_SNORM:
-			case GL_RED:             return sizeof(char);
-			case GL_RED_INTEGER:     return sizeof(char);
-			case GL_RG8:
-			case GL_RG8I:
-			case GL_RG8_SNORM:
-			case GL_RG:              return sizeof(char) * 2;
-			case GL_RG_INTEGER:      return sizeof(char) * 2;
-			case GL_RGB8:
-			case GL_RGB8I:
-			case GL_RGB8_SNORM:
-			case GL_RGB:             return sizeof(char) * 3;
-			case GL_RGB_INTEGER:     return sizeof(char) * 3;
-			case GL_RGBA8:
-			case GL_RGBA8I:
-			case GL_RGBA8_SNORM:
-			case GL_RGBA:            return sizeof(char) * 4;
-			case GL_RGBA_INTEGER:    return sizeof(char) * 4;
-			default: UNREACHABLE(format);
+			case GL_BYTE:           return 1;
+			case GL_UNSIGNED_BYTE:  return 1;
+			case GL_FLOAT:          return 4;
+			case GL_HALF_FLOAT:     return 2;
+			case GL_HALF_FLOAT_OES: return 2;
+			case GL_SHORT:          return 2;
+			case GL_UNSIGNED_SHORT: return 2;
+			case GL_INT:            return 4;
+			case GL_UNSIGNED_INT:   return 4;
+			default: UNREACHABLE(type);
 			}
 			break;
-		case GL_UNSIGNED_BYTE:
-			switch(format)
+		case GL_RG:
+		case GL_RG_INTEGER:
+		case GL_LUMINANCE_ALPHA:
+			switch(type)
 			{
-			case GL_R8:
-			case GL_R8UI:
-			case GL_RED:             return sizeof(unsigned char);
-			case GL_RED_INTEGER:     return sizeof(unsigned char);
-			case GL_ALPHA8_EXT:
-			case GL_ALPHA:           return sizeof(unsigned char);
-			case GL_LUMINANCE8_EXT:
-			case GL_LUMINANCE:       return sizeof(unsigned char);
-			case GL_LUMINANCE8_ALPHA8_EXT:
-			case GL_LUMINANCE_ALPHA: return sizeof(unsigned char) * 2;
-			case GL_RG8:
-			case GL_RG8UI:
-			case GL_RG:              return sizeof(unsigned char) * 2;
-			case GL_RG_INTEGER:      return sizeof(unsigned char) * 2;
-			case GL_RGB8:
-			case GL_RGB8UI:
-			case GL_SRGB8:
-			case GL_RGB:             return sizeof(unsigned char) * 3;
-			case GL_RGB_INTEGER:     return sizeof(unsigned char) * 3;
-			case GL_RGBA8:
-			case GL_RGBA8UI:
-			case GL_SRGB8_ALPHA8:
-			case GL_RGBA:            return sizeof(unsigned char) * 4;
-			case GL_RGBA_INTEGER:    return sizeof(unsigned char) * 4;
-			case GL_BGRA_EXT:
-			case GL_BGRA8_EXT:       return sizeof(unsigned char)* 4;
-			default: UNREACHABLE(format);
+			case GL_BYTE:           return 2;
+			case GL_UNSIGNED_BYTE:  return 2;
+			case GL_FLOAT:          return 8;
+			case GL_HALF_FLOAT:     return 4;
+			case GL_HALF_FLOAT_OES: return 4;
+			case GL_SHORT:          return 4;
+			case GL_UNSIGNED_SHORT: return 4;
+			case GL_INT:            return 8;
+			case GL_UNSIGNED_INT:   return 8;
+			default: UNREACHABLE(type);
 			}
 			break;
-		case GL_SHORT:
-			switch(format)
+		case GL_RGB:
+		case GL_RGB_INTEGER:
+			switch(type)
 			{
-			case GL_R16I:
-			case GL_RED_INTEGER:     return sizeof(short);
-			case GL_RG16I:
-			case GL_RG_INTEGER:      return sizeof(short) * 2;
-			case GL_RGB16I:
-			case GL_RGB_INTEGER:     return sizeof(short) * 3;
-			case GL_RGBA16I:
-			case GL_RGBA_INTEGER:    return sizeof(short) * 4;
-			default: UNREACHABLE(format);
+			case GL_BYTE:                         return 3;
+			case GL_UNSIGNED_BYTE:                return 3;
+			case GL_UNSIGNED_SHORT_5_6_5:         return 2;
+			case GL_UNSIGNED_INT_10F_11F_11F_REV: return 4;
+			case GL_UNSIGNED_INT_5_9_9_9_REV:     return 4;
+			case GL_FLOAT:                        return 12;
+			case GL_HALF_FLOAT:                   return 6;
+			case GL_HALF_FLOAT_OES:               return 6;
+			case GL_SHORT:                        return 6;
+			case GL_UNSIGNED_SHORT:               return 6;
+			case GL_INT:                          return 12;
+			case GL_UNSIGNED_INT:                 return 12;
+			default: UNREACHABLE(type);
 			}
 			break;
-		case GL_UNSIGNED_SHORT:
-			switch(format)
+		case GL_RGBA:
+		case GL_RGBA_INTEGER:
+		case GL_BGRA_EXT:
+			switch(type)
 			{
-			case GL_DEPTH_COMPONENT16:
-			case GL_DEPTH_COMPONENT: return sizeof(unsigned short);
-			case GL_R16UI:
-			case GL_RED_INTEGER:     return sizeof(unsigned short);
-			case GL_RG16UI:
-			case GL_RG_INTEGER:      return sizeof(unsigned short) * 2;
-			case GL_RGB16UI:
-			case GL_RGB_INTEGER:     return sizeof(unsigned short) * 3;
-			case GL_RGBA16UI:
-			case GL_RGBA_INTEGER:    return sizeof(unsigned short) * 4;
-			default: UNREACHABLE(format);
+			case GL_BYTE:                           return 4;
+			case GL_UNSIGNED_BYTE:                  return 4;
+			case GL_UNSIGNED_SHORT_4_4_4_4:         return 2;
+			case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT: return 2;
+			case GL_UNSIGNED_SHORT_5_5_5_1:         return 2;
+			case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT: return 2;
+			case GL_UNSIGNED_INT_2_10_10_10_REV:    return 4;
+			case GL_FLOAT:                          return 16;
+			case GL_HALF_FLOAT:                     return 8;
+			case GL_HALF_FLOAT_OES:                 return 8;
+			case GL_SHORT:                          return 8;
+			case GL_UNSIGNED_SHORT:                 return 8;
+			case GL_INT:                            return 16;
+			case GL_UNSIGNED_INT:                   return 16;
+			default: UNREACHABLE(type);
 			}
 			break;
-		case GL_INT:
-			switch(format)
+		case GL_DEPTH_COMPONENT:
+			switch(type)
 			{
-			case GL_R32I:
-			case GL_RED_INTEGER:     return sizeof(int);
-			case GL_RG32I:
-			case GL_RG_INTEGER:      return sizeof(int) * 2;
-			case GL_RGB32I:
-			case GL_RGB_INTEGER:     return sizeof(int) * 3;
-			case GL_RGBA32I:
-			case GL_RGBA_INTEGER:    return sizeof(int) * 4;
-			default: UNREACHABLE(format);
+			case GL_FLOAT:          return 4;
+			case GL_UNSIGNED_SHORT: return 2;
+			case GL_UNSIGNED_INT:   return 4;
+			default: UNREACHABLE(type);
 			}
 			break;
-		case GL_UNSIGNED_INT:
-			switch(format)
+		case GL_DEPTH_STENCIL:
+			switch(type)
 			{
-			case GL_DEPTH_COMPONENT16:
-			case GL_DEPTH_COMPONENT24:
-			case GL_DEPTH_COMPONENT32_OES:
-			case GL_DEPTH_COMPONENT: return sizeof(unsigned int);
-			case GL_R32UI:
-			case GL_RED_INTEGER:     return sizeof(unsigned int);
-			case GL_RG32UI:
-			case GL_RG_INTEGER:      return sizeof(unsigned int) * 2;
-			case GL_RGB32UI:
-			case GL_RGB_INTEGER:     return sizeof(unsigned int) * 3;
-			case GL_RGBA32UI:
-			case GL_RGBA_INTEGER:    return sizeof(unsigned int) * 4;
-			default: UNREACHABLE(format);
+			case GL_UNSIGNED_INT_24_8:              return 4;
+			case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: return 8;
+			default: UNREACHABLE(type);
 			}
 			break;
-		case GL_UNSIGNED_SHORT_4_4_4_4:
-		case GL_UNSIGNED_SHORT_5_5_5_1:
-		case GL_UNSIGNED_SHORT_5_6_5:
-		case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
-		case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
-			return sizeof(unsigned short);
-		case GL_UNSIGNED_INT_10F_11F_11F_REV:
-		case GL_UNSIGNED_INT_5_9_9_9_REV:
-		case GL_UNSIGNED_INT_2_10_10_10_REV:
-		case GL_UNSIGNED_INT_24_8_OES:
-			return sizeof(unsigned int);
-		case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
-			return sizeof(float) + sizeof(unsigned int);
-		case GL_FLOAT:
-			switch(format)
-			{
-			case GL_DEPTH_COMPONENT32F:
-			case GL_DEPTH_COMPONENT: return sizeof(float);
-			case GL_ALPHA32F_EXT:
-			case GL_ALPHA:           return sizeof(float);
-			case GL_LUMINANCE32F_EXT:
-			case GL_LUMINANCE:       return sizeof(float);
-			case GL_LUMINANCE_ALPHA32F_EXT:
-			case GL_LUMINANCE_ALPHA: return sizeof(float) * 2;
-			case GL_RED:             return sizeof(float);
-			case GL_R32F:            return sizeof(float);
-			case GL_RG:              return sizeof(float) * 2;
-			case GL_RG32F:           return sizeof(float) * 2;
-			case GL_RGB:             return sizeof(float) * 3;
-			case GL_RGB32F:          return sizeof(float) * 3;
-			case GL_RGBA:            return sizeof(float) * 4;
-			case GL_RGBA32F:         return sizeof(float) * 4;
-			case GL_R11F_G11F_B10F:  return sizeof(int);
-			case GL_RGB9_E5:         return sizeof(int);
-			default: UNREACHABLE(format);
-			}
-			break;
-		case GL_HALF_FLOAT:
-		case GL_HALF_FLOAT_OES:
-			switch(format)
-			{
-			case GL_ALPHA16F_EXT:
-			case GL_ALPHA:           return sizeof(unsigned short);
-			case GL_LUMINANCE16F_EXT:
-			case GL_LUMINANCE:       return sizeof(unsigned short);
-			case GL_LUMINANCE_ALPHA16F_EXT:
-			case GL_LUMINANCE_ALPHA: return sizeof(unsigned short) * 2;
-			case GL_RED:             return sizeof(unsigned short);
-			case GL_R16F:            return sizeof(unsigned short);
-			case GL_RG:              return sizeof(unsigned short) * 2;
-			case GL_RG16F:           return sizeof(unsigned short) * 2;
-			case GL_RGB:             return sizeof(unsigned short) * 3;
-			case GL_RGB16F:          return sizeof(unsigned short) * 3;
-			case GL_RGBA:            return sizeof(unsigned short) * 4;
-			case GL_RGBA16F:         return sizeof(unsigned short) * 4;
-			case GL_R11F_G11F_B10F:  return sizeof(int);
-			case GL_RGB9_E5:         return sizeof(int);
-			default: UNREACHABLE(format);
-			}
-			break;
-		default: UNREACHABLE(type);
+		default:
+			UNREACHABLE(format);
 		}
 
 		return 0;
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 1a363af..8e43645 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1588,9 +1588,8 @@
 	return mState.genericUniformBuffer;
 }
 
-GLsizei Context::getRequiredBufferSize(GLsizei width, GLsizei height, GLsizei depth, GLint internalformat, GLenum type) const
+GLsizei Context::getRequiredBufferSize(GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type) const
 {
-	GLenum format = GetSizedInternalFormat(internalformat, type);
 	GLsizei inputWidth = (mState.unpackInfo.rowLength == 0) ? width : mState.unpackInfo.rowLength;
 	GLsizei inputPitch = egl::ComputePitch(inputWidth, format, type, mState.unpackInfo.alignment);
 	GLsizei inputHeight = (mState.unpackInfo.imageHeight == 0) ? height : mState.unpackInfo.imageHeight;
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 4db4ba2..0d71c68 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -646,7 +646,7 @@
 	Buffer *getPixelPackBuffer() const;
 	Buffer *getPixelUnpackBuffer() const;
 	Buffer *getGenericUniformBuffer() const;
-	GLsizei getRequiredBufferSize(GLsizei width, GLsizei height, GLsizei depth, GLint internalformat, GLenum type) const;
+	GLsizei getRequiredBufferSize(GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type) const;
 	GLenum getPixels(const GLvoid **data, GLenum type, GLsizei imageSize) const;
 	bool getBuffer(GLenum target, es2::Buffer **buffer) const;
 	Program *getCurrentProgram() const;
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 4d190c9..b39ff06 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -6245,13 +6245,13 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type);
-		GLenum validationError = context->getPixels(&data, type, context->getRequiredBufferSize(width, height, depth, sizedInternalFormat, type));
+		GLenum validationError = context->getPixels(&data, type, context->getRequiredBufferSize(width, height, depth, format, type));
 		if(validationError != GL_NONE)
 		{
 			return error(validationError);
 		}
 
+		GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type);
 		texture->setImage(context, level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackInfo(), data);
 	}
 }
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 1c934a2..12de6fb 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -626,14 +626,13 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type);
-
-		GLenum validationError = context->getPixels(&data, type, context->getRequiredBufferSize(width, height, depth, sizedInternalFormat, type));
+		GLenum validationError = context->getPixels(&data, type, context->getRequiredBufferSize(width, height, depth, format, type));
 		if(validationError != GL_NONE)
 		{
 			return error(validationError);
 		}
 
+		GLenum sizedInternalFormat = GetSizedInternalFormat(internalformat, type);
 		texture->setImage(context, level, width, height, depth, sizedInternalFormat, format, type, context->getUnpackInfo(), data);
 	}
 }
@@ -675,21 +674,19 @@
 	{
 		es2::Texture3D *texture = (target == GL_TEXTURE_3D) ? context->getTexture3D() : context->getTexture2DArray();
 
-		GLenum sizedInternalFormat = GetSizedInternalFormat(format, type);
-
 		GLenum validationError = ValidateSubImageParams(false, false, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, texture, context->getClientVersion());
 		if(validationError != GL_NONE)
 		{
 			return error(validationError);
 		}
 
-		validationError = context->getPixels(&data, type, context->getRequiredBufferSize(width, height, depth, sizedInternalFormat, type));
+		validationError = context->getPixels(&data, type, context->getRequiredBufferSize(width, height, depth, format, type));
 		if(validationError != GL_NONE)
 		{
 			return error(validationError);
 		}
 
-		texture->subImage(context, level, xoffset, yoffset, zoffset, width, height, depth, sizedInternalFormat, type, context->getUnpackInfo(), data);
+		texture->subImage(context, level, xoffset, yoffset, zoffset, width, height, depth, format, type, context->getUnpackInfo(), data);
 	}
 }
 
