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
...@@ -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