Commit 8bcd9dd9 by Nicolas Capens

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/5094Tested-by: 's avatarNicolas Capens <capn@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent f330190f
...@@ -5155,25 +5155,49 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5155,25 +5155,49 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
return error(validationError); return error(validationError);
} }
switch(format)
{
case GL_ALPHA:
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
switch(type) 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_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) if(clientVersion < 3)
{ {
return error(GL_INVALID_ENUM); return error(GL_INVALID_ENUM);
} }
break; break;
default:
return error(GL_INVALID_ENUM);
}
switch(format)
{
case GL_ALPHA:
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
switch(type)
{
case GL_HALF_FLOAT:
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RED: case GL_RED:
...@@ -5185,7 +5209,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5185,7 +5209,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R8_SNORM: case GL_R8_SNORM:
...@@ -5194,23 +5218,18 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5194,23 +5218,18 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE: case GL_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R16F: case GL_R16F:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R32F: case GL_R32F:
...@@ -5219,7 +5238,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5219,7 +5238,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT: case GL_FLOAT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5235,7 +5254,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5235,7 +5254,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R8I: case GL_R8I:
...@@ -5244,7 +5263,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5244,7 +5263,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE: case GL_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R16UI: case GL_R16UI:
...@@ -5253,7 +5272,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5253,7 +5272,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT: case GL_UNSIGNED_SHORT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R16I: case GL_R16I:
...@@ -5262,7 +5281,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5262,7 +5281,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_SHORT: case GL_SHORT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R32UI: case GL_R32UI:
...@@ -5271,7 +5290,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5271,7 +5290,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R32I: case GL_R32I:
...@@ -5280,7 +5299,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5280,7 +5299,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_INT: case GL_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5296,7 +5315,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5296,7 +5315,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RG8I: case GL_RG8I:
...@@ -5305,7 +5324,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5305,7 +5324,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE: case GL_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RG16UI: case GL_RG16UI:
...@@ -5314,7 +5333,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5314,7 +5333,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT: case GL_UNSIGNED_SHORT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RG16I: case GL_RG16I:
...@@ -5323,7 +5342,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5323,7 +5342,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_SHORT: case GL_SHORT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RG32UI: case GL_RG32UI:
...@@ -5332,7 +5351,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5332,7 +5351,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RG32I: case GL_RG32I:
...@@ -5341,7 +5360,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5341,7 +5360,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_INT: case GL_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5357,7 +5376,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5357,7 +5376,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB8I: case GL_RGB8I:
...@@ -5366,7 +5385,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5366,7 +5385,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE: case GL_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB16UI: case GL_RGB16UI:
...@@ -5375,7 +5394,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5375,7 +5394,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT: case GL_UNSIGNED_SHORT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB16I: case GL_RGB16I:
...@@ -5384,7 +5403,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5384,7 +5403,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_SHORT: case GL_SHORT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB32UI: case GL_RGB32UI:
...@@ -5393,7 +5412,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5393,7 +5412,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB32I: case GL_RGB32I:
...@@ -5402,7 +5421,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5402,7 +5421,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_INT: case GL_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5418,7 +5437,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5418,7 +5437,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA8I: case GL_RGBA8I:
...@@ -5427,7 +5446,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5427,7 +5446,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE: case GL_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB10_A2UI: case GL_RGB10_A2UI:
...@@ -5436,7 +5455,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5436,7 +5455,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT_2_10_10_10_REV: case GL_UNSIGNED_INT_2_10_10_10_REV:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA16UI: case GL_RGBA16UI:
...@@ -5445,7 +5464,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5445,7 +5464,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT: case GL_UNSIGNED_SHORT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA16I: case GL_RGBA16I:
...@@ -5454,7 +5473,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5454,7 +5473,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_SHORT: case GL_SHORT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA32UI: case GL_RGBA32UI:
...@@ -5463,7 +5482,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5463,7 +5482,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA32I: case GL_RGBA32I:
...@@ -5472,7 +5491,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5472,7 +5491,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_INT: case GL_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5488,7 +5507,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5488,7 +5507,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RG8_SNORM: case GL_RG8_SNORM:
...@@ -5497,23 +5516,18 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5497,23 +5516,18 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE: case GL_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RG16F: case GL_RG16F:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RG32F: case GL_RG32F:
...@@ -5522,7 +5536,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5522,7 +5536,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT: case GL_FLOAT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5536,18 +5550,13 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5536,18 +5550,13 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
switch(type) switch(type)
{ {
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5:
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB8: case GL_RGB8:
...@@ -5556,7 +5565,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5556,7 +5565,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_SRGB8: case GL_SRGB8:
...@@ -5565,7 +5574,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5565,7 +5574,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB565: case GL_RGB565:
...@@ -5575,7 +5584,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5575,7 +5584,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB8_SNORM: case GL_RGB8_SNORM:
...@@ -5584,57 +5593,42 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5584,57 +5593,42 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE: case GL_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_R11F_G11F_B10F: case GL_R11F_G11F_B10F:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_UNSIGNED_INT_10F_11F_11F_REV: case GL_UNSIGNED_INT_10F_11F_11F_REV:
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB9_E5: case GL_RGB9_E5:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_UNSIGNED_INT_5_9_9_9_REV: case GL_UNSIGNED_INT_5_9_9_9_REV:
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB16F: case GL_RGB16F:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB32F: case GL_RGB32F:
...@@ -5643,7 +5637,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5643,7 +5637,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT: case GL_FLOAT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5657,11 +5651,6 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5657,11 +5651,6 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
switch(type) switch(type)
{ {
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1: case GL_UNSIGNED_SHORT_5_5_5_1:
...@@ -5669,7 +5658,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5669,7 +5658,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA8: case GL_RGBA8:
...@@ -5678,7 +5667,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5678,7 +5667,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_SRGB8_ALPHA8: case GL_SRGB8_ALPHA8:
...@@ -5687,7 +5676,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5687,7 +5676,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB5_A1: case GL_RGB5_A1:
...@@ -5698,7 +5687,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5698,7 +5687,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT_2_10_10_10_REV: case GL_UNSIGNED_INT_2_10_10_10_REV:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA8_SNORM: case GL_RGBA8_SNORM:
...@@ -5707,7 +5696,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5707,7 +5696,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE: case GL_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA4: case GL_RGBA4:
...@@ -5717,7 +5706,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5717,7 +5706,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGB10_A2: case GL_RGB10_A2:
...@@ -5726,23 +5715,18 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5726,23 +5715,18 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT_2_10_10_10_REV: case GL_UNSIGNED_INT_2_10_10_10_REV:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA16F: case GL_RGBA16F:
switch(type) switch(type)
{ {
case GL_HALF_FLOAT: case GL_HALF_FLOAT:
if(clientVersion < 3)
{
return error(GL_INVALID_ENUM);
}
break;
case GL_FLOAT: case GL_FLOAT:
case GL_HALF_FLOAT_OES: case GL_HALF_FLOAT_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_RGBA32F: case GL_RGBA32F:
...@@ -5751,7 +5735,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5751,7 +5735,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT: case GL_FLOAT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5764,7 +5748,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5764,7 +5748,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE: case GL_UNSIGNED_BYTE:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_DEPTH_COMPONENT: case GL_DEPTH_COMPONENT:
...@@ -5778,7 +5762,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5778,7 +5762,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_DEPTH_COMPONENT24: case GL_DEPTH_COMPONENT24:
...@@ -5788,7 +5772,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5788,7 +5772,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_DEPTH_COMPONENT32F: case GL_DEPTH_COMPONENT32F:
...@@ -5797,7 +5781,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5797,7 +5781,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT: case GL_FLOAT:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -5814,7 +5798,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5814,7 +5798,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT_24_8_OES: case GL_UNSIGNED_INT_24_8_OES:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
case GL_DEPTH32F_STENCIL8: case GL_DEPTH32F_STENCIL8:
...@@ -5823,7 +5807,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, ...@@ -5823,7 +5807,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
break; break;
default: default:
return error(GL_INVALID_ENUM); return error(GL_INVALID_OPERATION);
} }
break; break;
default: default:
...@@ -6222,9 +6206,9 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs ...@@ -6222,9 +6206,9 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
return error(GL_INVALID_VALUE); 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) if(width == 0 || height == 0 || !pixels)
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "utilities.h" #include "utilities.h"
#include "main.h"
#include "mathutil.h" #include "mathutil.h"
#include "Context.h" #include "Context.h"
#include "common/debug.h" #include "common/debug.h"
...@@ -702,125 +703,200 @@ namespace es2 ...@@ -702,125 +703,200 @@ namespace es2
return target == GL_TEXTURE_2D || IsCubemapTextureTarget(target) || target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY; 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 ValidateTextureFormatType(GLenum format, GLenum type, GLint clientVersion)
bool CheckTextureFormatType(GLenum format, GLenum type, GLint clientVersion)
{ {
switch(type) switch(type)
{ {
case GL_UNSIGNED_BYTE: 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: // 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:
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, false);
}
break;
default:
return error(GL_INVALID_ENUM, false);
}
switch(format) switch(format)
{ {
case GL_RGBA:
case GL_BGRA_EXT:
case GL_RGB:
case GL_ALPHA: case GL_ALPHA:
case GL_RGB:
case GL_RGBA:
case GL_LUMINANCE: case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA: case GL_LUMINANCE_ALPHA:
return true; 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:
case GL_RED_INTEGER: case GL_RED_INTEGER:
case GL_RG: case GL_RG:
case GL_RG_INTEGER: case GL_RG_INTEGER:
case GL_RGB_INTEGER: case GL_RGB_INTEGER:
case GL_RGBA_INTEGER: case GL_RGBA_INTEGER:
return clientVersion >= 3; if(clientVersion < 3)
{
return error(GL_INVALID_ENUM, false);
}
break;
default: default:
return false; return error(GL_INVALID_ENUM, false);
} }
case GL_BYTE:
case GL_SHORT:
case GL_INT:
switch(format) switch(format)
{ {
case GL_RGBA: case GL_RGBA:
case GL_BGRA_EXT: switch(type)
case GL_RGB: {
case GL_ALPHA: case GL_UNSIGNED_BYTE:
case GL_LUMINANCE: case GL_BYTE:
case GL_LUMINANCE_ALPHA: case GL_HALF_FLOAT_OES:
case GL_RED: case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_RED_INTEGER: case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_RG: case GL_UNSIGNED_INT_2_10_10_10_REV:
case GL_RG_INTEGER: case GL_HALF_FLOAT:
case GL_RGB_INTEGER: case GL_FLOAT:
case GL_RGBA_INTEGER: break;
return clientVersion >= 3;
default: default:
return false; 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_UNSIGNED_SHORT:
case GL_SHORT:
case GL_UNSIGNED_INT: case GL_UNSIGNED_INT:
switch(format) case GL_INT:
{ case GL_UNSIGNED_INT_2_10_10_10_REV:
case GL_RGBA: break;
case GL_BGRA_EXT: default:
return error(GL_INVALID_OPERATION, false);
}
break;
case GL_RGB: case GL_RGB:
case GL_ALPHA: switch(type)
case GL_LUMINANCE: {
case GL_LUMINANCE_ALPHA: case GL_UNSIGNED_BYTE:
case GL_RED: case GL_BYTE:
case GL_RED_INTEGER: case GL_HALF_FLOAT_OES:
case GL_RG: case GL_UNSIGNED_SHORT_5_6_5:
case GL_RG_INTEGER: 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: case GL_RGB_INTEGER:
case GL_RGBA_INTEGER: switch(type)
return clientVersion >= 3; {
case GL_DEPTH_COMPONENT: case GL_UNSIGNED_BYTE:
return (clientVersion >= 3) || (type == GL_UNSIGNED_INT); 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: default:
return false; 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_HALF_FLOAT:
if(clientVersion < 3) case GL_FLOAT:
break;
default:
return error(GL_INVALID_OPERATION, false);
}
break;
case GL_RG_INTEGER:
case GL_RED_INTEGER:
switch(type)
{ {
return false; 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);
} }
case GL_FLOAT: break;
case GL_HALF_FLOAT_OES: case GL_DEPTH_COMPONENT:
switch(format) switch(type)
{ {
case GL_RGBA: case GL_UNSIGNED_SHORT:
case GL_RGB: case GL_UNSIGNED_INT:
case GL_ALPHA: case GL_FLOAT:
case GL_LUMINANCE: break;
case GL_LUMINANCE_ALPHA:
return true;
case GL_RED:
case GL_RG:
return clientVersion >= 3;
default: default:
return false; return error(GL_INVALID_OPERATION, false);
} }
case GL_UNSIGNED_INT_2_10_10_10_REV: break;
switch(format) case GL_DEPTH_STENCIL:
switch(type)
{ {
case GL_RGBA: case GL_UNSIGNED_INT_24_8:
case GL_RGBA_INTEGER: case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
return clientVersion >= 3; break;
default: default:
return false; return error(GL_INVALID_OPERATION, false);
} }
case GL_UNSIGNED_SHORT_4_4_4_4: break;
case GL_UNSIGNED_SHORT_5_5_5_1: case GL_LUMINANCE_ALPHA:
return (format == GL_RGBA); case GL_LUMINANCE:
case GL_UNSIGNED_INT_10F_11F_11F_REV: case GL_ALPHA:
case GL_UNSIGNED_INT_5_9_9_9_REV: switch(type)
if(clientVersion < 3)
{ {
return false; case GL_UNSIGNED_BYTE:
case GL_HALF_FLOAT_OES:
case GL_FLOAT:
break;
default:
return error(GL_INVALID_OPERATION, false);
} }
case GL_UNSIGNED_SHORT_5_6_5: break;
return (format == GL_RGB); case GL_BGRA_EXT:
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: if(type != GL_UNSIGNED_BYTE)
if(clientVersion < 3)
{ {
return false; return error(GL_INVALID_OPERATION, false);
} }
case GL_UNSIGNED_INT_24_8_OES: break;
return (format == GL_DEPTH_STENCIL_OES);
default: default:
return false; UNREACHABLE(format);
return error(GL_INVALID_ENUM, false);
} }
return true;
} }
bool IsColorRenderable(GLenum internalformat, GLint clientVersion) bool IsColorRenderable(GLenum internalformat, GLint clientVersion)
......
...@@ -51,7 +51,7 @@ namespace es2 ...@@ -51,7 +51,7 @@ namespace es2
bool IsCubemapTextureTarget(GLenum target); bool IsCubemapTextureTarget(GLenum target);
int CubeFaceIndex(GLenum cubeTarget); int CubeFaceIndex(GLenum cubeTarget);
bool IsTextureTarget(GLenum target); 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 IsColorRenderable(GLenum internalformat, GLint clientVersion);
bool IsDepthRenderable(GLenum internalformat); bool IsDepthRenderable(GLenum internalformat);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment