Fix error on invalid type/format combination.

GL_INVALID_ENUM is for enum values that are never valid for the function.
GL_INVALID_OPERATION is expected for enum combinations that are not valid.

Change-Id: I43a6cd169303420a680e4cab15683605a8684517
Reviewed-on: https://swiftshader-review.googlesource.com/5094
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 467aafe..ae995bf 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -5155,6 +5155,35 @@
 			return error(validationError);

 		}

 

+		switch(type)

+		{

+		case GL_UNSIGNED_BYTE:

+		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_FLOAT:                   // GL_OES_texture_float

+		case GL_HALF_FLOAT_OES:          // GL_OES_texture_half_float

+		case GL_UNSIGNED_INT_24_8_OES:   // GL_OES_packed_depth_stencil

+		case GL_UNSIGNED_SHORT:          // GL_OES_depth_texture

+		case GL_UNSIGNED_INT:            // GL_OES_depth_texture

+			break;

+		case GL_BYTE:

+		case GL_SHORT:

+		case GL_INT:

+		case GL_HALF_FLOAT:

+		case GL_UNSIGNED_INT_2_10_10_10_REV:

+		case GL_UNSIGNED_INT_10F_11F_11F_REV:

+		case GL_UNSIGNED_INT_5_9_9_9_REV:

+		case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:

+			if(clientVersion < 3)

+			{

+				return error(GL_INVALID_ENUM);

+			}

+			break;

+		default:

+			return error(GL_INVALID_ENUM);

+		}

+

 		switch(format)

 		{

 		case GL_ALPHA:

@@ -5163,17 +5192,12 @@
 			switch(type)

 			{

 			case GL_HALF_FLOAT:

-				if(clientVersion < 3)

-				{

-					return error(GL_INVALID_ENUM);

-				}

-				break;

 			case GL_UNSIGNED_BYTE:

 			case GL_FLOAT:

 			case GL_HALF_FLOAT_OES:

 				break;

 			default:

-				return error(GL_INVALID_ENUM);

+				return error(GL_INVALID_OPERATION);

 			}

 			break;

 		case GL_RED:

@@ -5185,7 +5209,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R8_SNORM:

@@ -5194,23 +5218,18 @@
 				case GL_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R16F:

 				switch(type)

 				{

 				case GL_HALF_FLOAT:

-					if(clientVersion < 3)

-					{

-						return error(GL_INVALID_ENUM);

-					}

-					break;

 				case GL_FLOAT:

 				case GL_HALF_FLOAT_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R32F:

@@ -5219,7 +5238,7 @@
 				case GL_FLOAT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5235,7 +5254,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R8I:

@@ -5244,7 +5263,7 @@
 				case GL_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R16UI:

@@ -5253,7 +5272,7 @@
 				case GL_UNSIGNED_SHORT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R16I:

@@ -5262,7 +5281,7 @@
 				case GL_SHORT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R32UI:

@@ -5271,7 +5290,7 @@
 				case GL_UNSIGNED_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R32I:

@@ -5280,7 +5299,7 @@
 				case GL_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5296,7 +5315,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RG8I:

@@ -5305,7 +5324,7 @@
 				case GL_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RG16UI:

@@ -5314,7 +5333,7 @@
 				case GL_UNSIGNED_SHORT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RG16I:

@@ -5323,7 +5342,7 @@
 				case GL_SHORT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RG32UI:

@@ -5332,7 +5351,7 @@
 				case GL_UNSIGNED_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RG32I:

@@ -5341,7 +5360,7 @@
 				case GL_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5357,7 +5376,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB8I:

@@ -5366,7 +5385,7 @@
 				case GL_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB16UI:

@@ -5375,7 +5394,7 @@
 				case GL_UNSIGNED_SHORT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB16I:

@@ -5384,7 +5403,7 @@
 				case GL_SHORT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB32UI:

@@ -5393,7 +5412,7 @@
 				case GL_UNSIGNED_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB32I:

@@ -5402,7 +5421,7 @@
 				case GL_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5418,7 +5437,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA8I:

@@ -5427,7 +5446,7 @@
 				case GL_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB10_A2UI:

@@ -5436,7 +5455,7 @@
 				case GL_UNSIGNED_INT_2_10_10_10_REV:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA16UI:

@@ -5445,7 +5464,7 @@
 				case GL_UNSIGNED_SHORT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA16I:

@@ -5454,7 +5473,7 @@
 				case GL_SHORT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA32UI:

@@ -5463,7 +5482,7 @@
 				case GL_UNSIGNED_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA32I:

@@ -5472,7 +5491,7 @@
 				case GL_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5488,7 +5507,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RG8_SNORM:

@@ -5497,23 +5516,18 @@
 				case GL_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RG16F:

 				switch(type)

 				{

 				case GL_HALF_FLOAT:

-					if(clientVersion < 3)

-					{

-						return error(GL_INVALID_ENUM);

-					}

-					break;

 				case GL_FLOAT:

 				case GL_HALF_FLOAT_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RG32F:

@@ -5522,7 +5536,7 @@
 				case GL_FLOAT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5536,18 +5550,13 @@
 				switch(type)

 				{

 				case GL_HALF_FLOAT:

-					if(clientVersion < 3)

-					{

-						return error(GL_INVALID_ENUM);

-					}

-					break;

 				case GL_UNSIGNED_BYTE:

 				case GL_UNSIGNED_SHORT_5_6_5:

 				case GL_FLOAT:

 				case GL_HALF_FLOAT_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB8:

@@ -5556,7 +5565,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_SRGB8:

@@ -5565,7 +5574,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB565:

@@ -5575,7 +5584,7 @@
 				case GL_UNSIGNED_SHORT_5_6_5:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB8_SNORM:

@@ -5584,57 +5593,42 @@
 				case GL_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_R11F_G11F_B10F:

 				switch(type)

 				{

 				case GL_HALF_FLOAT:

-					if(clientVersion < 3)

-					{

-						return error(GL_INVALID_ENUM);

-					}

-					break;

 				case GL_UNSIGNED_INT_10F_11F_11F_REV:

 				case GL_FLOAT:

 				case GL_HALF_FLOAT_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB9_E5:

 				switch(type)

 				{

 				case GL_HALF_FLOAT:

-					if(clientVersion < 3)

-					{

-						return error(GL_INVALID_ENUM);

-					}

-					break;

 				case GL_UNSIGNED_INT_5_9_9_9_REV:

 				case GL_FLOAT:

 				case GL_HALF_FLOAT_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB16F:

 				switch(type)

 				{

 				case GL_HALF_FLOAT:

-					if(clientVersion < 3)

-					{

-						return error(GL_INVALID_ENUM);

-					}

-					break;

 				case GL_FLOAT:

 				case GL_HALF_FLOAT_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB32F:

@@ -5643,7 +5637,7 @@
 				case GL_FLOAT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5657,11 +5651,6 @@
 				switch(type)

 				{

 				case GL_HALF_FLOAT:

-					if(clientVersion < 3)

-					{

-						return error(GL_INVALID_ENUM);

-					}

-					break;

 				case GL_UNSIGNED_BYTE:

 				case GL_UNSIGNED_SHORT_4_4_4_4:

 				case GL_UNSIGNED_SHORT_5_5_5_1:

@@ -5669,7 +5658,7 @@
 				case GL_HALF_FLOAT_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA8:

@@ -5678,7 +5667,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_SRGB8_ALPHA8:

@@ -5687,7 +5676,7 @@
 				case GL_UNSIGNED_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB5_A1:

@@ -5698,7 +5687,7 @@
 				case GL_UNSIGNED_INT_2_10_10_10_REV:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA8_SNORM:

@@ -5707,7 +5696,7 @@
 				case GL_BYTE:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA4:

@@ -5717,7 +5706,7 @@
 				case GL_UNSIGNED_SHORT_4_4_4_4:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGB10_A2:

@@ -5726,23 +5715,18 @@
 				case GL_UNSIGNED_INT_2_10_10_10_REV:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA16F:

 				switch(type)

 				{

 				case GL_HALF_FLOAT:

-					if(clientVersion < 3)

-					{

-						return error(GL_INVALID_ENUM);

-					}

-					break;

 				case GL_FLOAT:

 				case GL_HALF_FLOAT_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_RGBA32F:

@@ -5751,7 +5735,7 @@
 				case GL_FLOAT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5764,7 +5748,7 @@
 			case GL_UNSIGNED_BYTE:

 				break;

 			default:

-				return error(GL_INVALID_ENUM);

+				return error(GL_INVALID_OPERATION);

 			}

 			break;

 		case GL_DEPTH_COMPONENT:

@@ -5778,7 +5762,7 @@
 				case GL_UNSIGNED_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_DEPTH_COMPONENT24:

@@ -5788,7 +5772,7 @@
 				case GL_UNSIGNED_INT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_DEPTH_COMPONENT32F:

@@ -5797,7 +5781,7 @@
 				case GL_FLOAT:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -5814,7 +5798,7 @@
 				case GL_UNSIGNED_INT_24_8_OES:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			case GL_DEPTH32F_STENCIL8:

@@ -5823,7 +5807,7 @@
 				case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:

 					break;

 				default:

-					return error(GL_INVALID_ENUM);

+					return error(GL_INVALID_OPERATION);

 				}

 				break;

 			default:

@@ -6222,9 +6206,9 @@
 		return error(GL_INVALID_VALUE);

 	}

 

-	if(!es2::CheckTextureFormatType(format, type, egl::getClientVersion()))

+	if(!es2::ValidateTextureFormatType(format, type, egl::getClientVersion()))

 	{

-		return error(GL_INVALID_ENUM);

+		return;

 	}

 

 	if(width == 0 || height == 0 || !pixels)

diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 8ef44e8..533ea99 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -13,6 +13,7 @@
 

 #include "utilities.h"

 

+#include "main.h"

 #include "mathutil.h"

 #include "Context.h"

 #include "common/debug.h"

@@ -702,125 +703,200 @@
 		return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY;

 	}

 

-	// Verify that format/type are one of the combinations from table 3.4.

-	bool CheckTextureFormatType(GLenum format, GLenum type, GLint clientVersion)

+	bool ValidateTextureFormatType(GLenum format, GLenum type, GLint clientVersion)

 	{

 		switch(type)

 		{

 		case GL_UNSIGNED_BYTE:

-			switch(format)

-			{

-			case GL_RGBA:

-			case GL_BGRA_EXT:

-			case GL_RGB:

-			case GL_ALPHA:

-			case GL_LUMINANCE:

-			case GL_LUMINANCE_ALPHA:

-				return true;

-			case GL_RED:

-			case GL_RED_INTEGER:

-			case GL_RG:

-			case GL_RG_INTEGER:

-			case GL_RGB_INTEGER:

-			case GL_RGBA_INTEGER:

-				return clientVersion >= 3;

-			default:

-				return false;

-			}

+		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_FLOAT:               // GL_OES_texture_float

+		case GL_HALF_FLOAT_OES:      // GL_OES_texture_half_float

+		case GL_UNSIGNED_INT_24_8:   // GL_OES_packed_depth_stencil (GL_UNSIGNED_INT_24_8_EXT)

+		case GL_UNSIGNED_SHORT:      // GL_OES_depth_texture

+		case GL_UNSIGNED_INT:        // GL_OES_depth_texture

+			break;

 		case GL_BYTE:

 		case GL_SHORT:

 		case GL_INT:

-			switch(format)

-			{

-			case GL_RGBA:

-			case GL_BGRA_EXT:

-			case GL_RGB:

-			case GL_ALPHA:

-			case GL_LUMINANCE:

-			case GL_LUMINANCE_ALPHA:

-			case GL_RED:

-			case GL_RED_INTEGER:

-			case GL_RG:

-			case GL_RG_INTEGER:

-			case GL_RGB_INTEGER:

-			case GL_RGBA_INTEGER:

-				return clientVersion >= 3;

-			default:

-				return false;

-			}

-		case GL_UNSIGNED_SHORT:

-		case GL_UNSIGNED_INT:

-			switch(format)

-			{

-			case GL_RGBA:

-			case GL_BGRA_EXT:

-			case GL_RGB:

-			case GL_ALPHA:

-			case GL_LUMINANCE:

-			case GL_LUMINANCE_ALPHA:

-			case GL_RED:

-			case GL_RED_INTEGER:

-			case GL_RG:

-			case GL_RG_INTEGER:

-			case GL_RGB_INTEGER:

-			case GL_RGBA_INTEGER:

-				return clientVersion >= 3;

-			case GL_DEPTH_COMPONENT:

-				return (clientVersion >= 3) || (type == GL_UNSIGNED_INT);

-			default:

-				return false;

-			}

 		case GL_HALF_FLOAT:

-			if(clientVersion < 3)

-			{

-				return false;

-			}

-		case GL_FLOAT:

-		case GL_HALF_FLOAT_OES:

-			switch(format)

-			{

-			case GL_RGBA:

-			case GL_RGB:

-			case GL_ALPHA:

-			case GL_LUMINANCE:

-			case GL_LUMINANCE_ALPHA:

-				return true;

-			case GL_RED:

-			case GL_RG:

-				return clientVersion >= 3;

-			default:

-				return false;

-			}

 		case GL_UNSIGNED_INT_2_10_10_10_REV:

-			switch(format)

-			{

-			case GL_RGBA:

-			case GL_RGBA_INTEGER:

-				return clientVersion >= 3;

-			default:

-				return false;

-			}

-		case GL_UNSIGNED_SHORT_4_4_4_4:

-		case GL_UNSIGNED_SHORT_5_5_5_1:

-			return (format == GL_RGBA);

 		case GL_UNSIGNED_INT_10F_11F_11F_REV:

 		case GL_UNSIGNED_INT_5_9_9_9_REV:

-			if(clientVersion < 3)

-			{

-				return false;

-			}

-		case GL_UNSIGNED_SHORT_5_6_5:

-			return (format == GL_RGB);

 		case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:

 			if(clientVersion < 3)

 			{

-				return false;

+				return error(GL_INVALID_ENUM, false);

 			}

-		case GL_UNSIGNED_INT_24_8_OES:

-			return (format == GL_DEPTH_STENCIL_OES);

+			break;

 		default:

-			return false;

+			return error(GL_INVALID_ENUM, false);

 		}

+

+		switch(format)

+		{

+		case GL_ALPHA:

+		case GL_RGB:

+		case GL_RGBA:

+		case GL_LUMINANCE:

+		case GL_LUMINANCE_ALPHA:

+		case GL_BGRA_EXT:          // GL_EXT_texture_format_BGRA8888

+		case GL_DEPTH_STENCIL:     // GL_OES_packed_depth_stencil (GL_DEPTH_STENCIL_OES)

+		case GL_DEPTH_COMPONENT:   // GL_OES_depth_texture

+			break;

+		case GL_RED:

+		case GL_RED_INTEGER:

+		case GL_RG:

+		case GL_RG_INTEGER:

+		case GL_RGB_INTEGER:

+		case GL_RGBA_INTEGER:

+			if(clientVersion < 3)

+			{

+				return error(GL_INVALID_ENUM, false);

+			}

+			break;

+		default:

+			return error(GL_INVALID_ENUM, false);

+		}

+

+		switch(format)

+		{

+		case GL_RGBA:

+			switch(type)

+			{

+			case GL_UNSIGNED_BYTE:

+			case GL_BYTE:

+			case GL_HALF_FLOAT_OES:

+			case GL_UNSIGNED_SHORT_4_4_4_4:

+			case GL_UNSIGNED_SHORT_5_5_5_1:

+			case GL_UNSIGNED_INT_2_10_10_10_REV:

+			case GL_HALF_FLOAT:

+			case GL_FLOAT:

+				break;

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_RGBA_INTEGER:

+			switch(type)

+			{

+			case GL_UNSIGNED_BYTE:

+			case GL_BYTE:

+			case GL_UNSIGNED_SHORT:

+			case GL_SHORT:

+			case GL_UNSIGNED_INT:

+			case GL_INT:

+			case GL_UNSIGNED_INT_2_10_10_10_REV:

+				break;

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_RGB:

+			switch(type)

+			{

+			case GL_UNSIGNED_BYTE:

+			case GL_BYTE:

+			case GL_HALF_FLOAT_OES:

+			case GL_UNSIGNED_SHORT_5_6_5:

+			case GL_UNSIGNED_INT_10F_11F_11F_REV:

+			case GL_UNSIGNED_INT_5_9_9_9_REV:

+			case GL_HALF_FLOAT:

+			case GL_FLOAT:

+				break;

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_RGB_INTEGER:

+			switch(type)

+			{

+			case GL_UNSIGNED_BYTE:

+			case GL_BYTE:

+			case GL_UNSIGNED_SHORT:

+			case GL_SHORT:

+			case GL_UNSIGNED_INT:

+			case GL_INT:

+			case GL_UNSIGNED_INT_2_10_10_10_REV:

+				break;

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_RG:

+		case GL_RED:

+			switch(type)

+			{

+			case GL_UNSIGNED_BYTE:

+			case GL_BYTE:

+			case GL_HALF_FLOAT:

+			case GL_FLOAT:

+				break;

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_RG_INTEGER:

+		case GL_RED_INTEGER:

+			switch(type)

+			{

+			case GL_UNSIGNED_BYTE:

+			case GL_BYTE:

+			case GL_UNSIGNED_SHORT:

+			case GL_SHORT:

+			case GL_UNSIGNED_INT:

+			case GL_INT:

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_DEPTH_COMPONENT:

+			switch(type)

+			{

+			case GL_UNSIGNED_SHORT:

+			case GL_UNSIGNED_INT:

+			case GL_FLOAT:

+				break;

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_DEPTH_STENCIL:

+			switch(type)

+			{

+			case GL_UNSIGNED_INT_24_8:

+			case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:

+				break;

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_LUMINANCE_ALPHA:

+		case GL_LUMINANCE:

+		case GL_ALPHA:

+			switch(type)

+			{

+			case GL_UNSIGNED_BYTE:

+			case GL_HALF_FLOAT_OES:

+			case GL_FLOAT:

+				break;

+			default:

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		case GL_BGRA_EXT:

+			if(type != GL_UNSIGNED_BYTE)

+			{

+				return error(GL_INVALID_OPERATION, false);

+			}

+			break;

+		default:

+			UNREACHABLE(format);

+			return error(GL_INVALID_ENUM, false);

+		}

+

+		return true;

 	}

 

 	bool IsColorRenderable(GLenum internalformat, GLint clientVersion)

@@ -1301,7 +1377,7 @@
 		case GL_RGB565:               return sw::FORMAT_R5G6B5;

 		case GL_RGB8_OES:             return sw::FORMAT_X8B8G8R8;

 		case GL_DEPTH_COMPONENT16:

-		case GL_STENCIL_INDEX8:       

+		case GL_STENCIL_INDEX8:

 		case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;

 		case GL_DEPTH_COMPONENT32_OES:return sw::FORMAT_D32;

 		case GL_R8:                   return sw::FORMAT_R8;

diff --git a/src/OpenGL/libGLESv2/utilities.h b/src/OpenGL/libGLESv2/utilities.h
index 5e14b9c..f289588 100644
--- a/src/OpenGL/libGLESv2/utilities.h
+++ b/src/OpenGL/libGLESv2/utilities.h
@@ -51,7 +51,7 @@
 	bool IsCubemapTextureTarget(GLenum target);

 	int CubeFaceIndex(GLenum cubeTarget);

 	bool IsTextureTarget(GLenum target);

-	bool CheckTextureFormatType(GLenum format, GLenum type, GLint clientVersion);

+	bool ValidateTextureFormatType(GLenum format, GLenum type, GLint clientVersion);

 

 	bool IsColorRenderable(GLenum internalformat, GLint clientVersion);

 	bool IsDepthRenderable(GLenum internalformat);