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:
switch(format) case GL_UNSIGNED_SHORT_4_4_4_4:
{ case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_RGBA: case GL_UNSIGNED_SHORT_5_6_5:
case GL_BGRA_EXT: case GL_FLOAT: // GL_OES_texture_float
case GL_RGB: case GL_HALF_FLOAT_OES: // GL_OES_texture_half_float
case GL_ALPHA: case GL_UNSIGNED_INT_24_8: // GL_OES_packed_depth_stencil (GL_UNSIGNED_INT_24_8_EXT)
case GL_LUMINANCE: case GL_UNSIGNED_SHORT: // GL_OES_depth_texture
case GL_LUMINANCE_ALPHA: case GL_UNSIGNED_INT: // GL_OES_depth_texture
return true; break;
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_BYTE: case GL_BYTE:
case GL_SHORT: case GL_SHORT:
case GL_INT: case GL_INT:
switch(format) 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)
{
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)
{ {
case GL_RGBA: return error(GL_INVALID_ENUM, false);
case GL_BGRA_EXT: }
case GL_RGB: break;
case GL_ALPHA: default:
case GL_LUMINANCE: return error(GL_INVALID_ENUM, false);
case GL_LUMINANCE_ALPHA: }
case GL_RED:
case GL_RED_INTEGER: switch(format)
case GL_RG: {
case GL_RG_INTEGER: case GL_RGBA:
case GL_RGB_INTEGER: switch(type)
case GL_RGBA_INTEGER: {
return clientVersion >= 3; 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: default:
return false; return error(GL_INVALID_OPERATION, false);
} }
case GL_UNSIGNED_SHORT: break;
case GL_UNSIGNED_INT: case GL_RGBA_INTEGER:
switch(format) switch(type)
{ {
case GL_RGBA: case GL_UNSIGNED_BYTE:
case GL_BGRA_EXT: case GL_BYTE:
case GL_RGB: case GL_UNSIGNED_SHORT:
case GL_ALPHA: case GL_SHORT:
case GL_LUMINANCE: case GL_UNSIGNED_INT:
case GL_LUMINANCE_ALPHA: case GL_INT:
case GL_RED: case GL_UNSIGNED_INT_2_10_10_10_REV:
case GL_RED_INTEGER: break;
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: default:
return false; return error(GL_INVALID_OPERATION, false);
} }
case GL_HALF_FLOAT: break;
if(clientVersion < 3) case GL_RGB:
switch(type)
{ {
return false; 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);
} }
case GL_FLOAT: break;
case GL_HALF_FLOAT_OES: case GL_RGB_INTEGER:
switch(format) switch(type)
{ {
case GL_RGBA: case GL_UNSIGNED_BYTE:
case GL_RGB: case GL_BYTE:
case GL_ALPHA: case GL_UNSIGNED_SHORT:
case GL_LUMINANCE: case GL_SHORT:
case GL_LUMINANCE_ALPHA: case GL_UNSIGNED_INT:
return true; case GL_INT:
case GL_RED: case GL_UNSIGNED_INT_2_10_10_10_REV:
case GL_RG: break;
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_RG:
case GL_RED:
switch(type)
{ {
case GL_RGBA: case GL_UNSIGNED_BYTE:
case GL_RGBA_INTEGER: case GL_BYTE:
return clientVersion >= 3; case GL_HALF_FLOAT:
case GL_FLOAT:
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_RG_INTEGER:
return (format == GL_RGBA); case GL_RED_INTEGER:
case GL_UNSIGNED_INT_10F_11F_11F_REV: switch(type)
case GL_UNSIGNED_INT_5_9_9_9_REV:
if(clientVersion < 3)
{ {
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_UNSIGNED_SHORT_5_6_5: break;
return (format == GL_RGB); case GL_DEPTH_COMPONENT:
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: switch(type)
if(clientVersion < 3)
{ {
return false; 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);
} }
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)
...@@ -1301,7 +1377,7 @@ namespace es2sw ...@@ -1301,7 +1377,7 @@ namespace es2sw
case GL_RGB565: return sw::FORMAT_R5G6B5; case GL_RGB565: return sw::FORMAT_R5G6B5;
case GL_RGB8_OES: return sw::FORMAT_X8B8G8R8; case GL_RGB8_OES: return sw::FORMAT_X8B8G8R8;
case GL_DEPTH_COMPONENT16: case GL_DEPTH_COMPONENT16:
case GL_STENCIL_INDEX8: case GL_STENCIL_INDEX8:
case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8; case GL_DEPTH24_STENCIL8_OES: return sw::FORMAT_D24S8;
case GL_DEPTH_COMPONENT32_OES:return sw::FORMAT_D32; case GL_DEPTH_COMPONENT32_OES:return sw::FORMAT_D32;
case GL_R8: return sw::FORMAT_R8; case GL_R8: return sw::FORMAT_R8;
......
...@@ -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