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,6 +5155,35 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5235,7 +5254,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_R8I:
......@@ -5244,7 +5263,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_R16UI:
......@@ -5253,7 +5272,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_R16I:
......@@ -5262,7 +5281,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_R32UI:
......@@ -5271,7 +5290,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_R32I:
......@@ -5280,7 +5299,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_INT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5296,7 +5315,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RG8I:
......@@ -5305,7 +5324,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RG16UI:
......@@ -5314,7 +5333,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RG16I:
......@@ -5323,7 +5342,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RG32UI:
......@@ -5332,7 +5351,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RG32I:
......@@ -5341,7 +5360,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_INT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5357,7 +5376,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGB8I:
......@@ -5366,7 +5385,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGB16UI:
......@@ -5375,7 +5394,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGB16I:
......@@ -5384,7 +5403,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGB32UI:
......@@ -5393,7 +5412,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGB32I:
......@@ -5402,7 +5421,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_INT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5418,7 +5437,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGBA8I:
......@@ -5427,7 +5446,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGB10_A2UI:
......@@ -5436,7 +5455,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGBA16I:
......@@ -5454,7 +5473,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_SHORT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGBA32UI:
......@@ -5463,7 +5482,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_INT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGBA32I:
......@@ -5472,7 +5491,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_INT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5488,7 +5507,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5536,18 +5550,13 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_SRGB8:
......@@ -5565,7 +5574,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_UNSIGNED_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGB565:
......@@ -5575,7 +5584,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5657,11 +5651,6 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_BYTE:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
case GL_RGBA4:
......@@ -5717,7 +5706,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5764,7 +5748,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
case GL_FLOAT:
break;
default:
return error(GL_INVALID_ENUM);
return error(GL_INVALID_OPERATION);
}
break;
default:
......@@ -5814,7 +5798,7 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
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 @@ void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLs
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)
......
......@@ -13,6 +13,7 @@
#include "utilities.h"
#include "main.h"
#include "mathutil.h"
#include "Context.h"
#include "common/debug.h"
......@@ -702,125 +703,200 @@ namespace es2
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_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:
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;
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 false;
return error(GL_INVALID_OPERATION, false);
}
case GL_UNSIGNED_SHORT:
case GL_UNSIGNED_INT:
switch(format)
break;
case GL_RGBA_INTEGER:
switch(type)
{
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);
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 false;
return error(GL_INVALID_OPERATION, false);
}
case GL_HALF_FLOAT:
if(clientVersion < 3)
break;
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:
case GL_HALF_FLOAT_OES:
switch(format)
break;
case GL_RGB_INTEGER:
switch(type)
{
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;
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 false;
return error(GL_INVALID_OPERATION, false);
}
case GL_UNSIGNED_INT_2_10_10_10_REV:
switch(format)
break;
case GL_RG:
case GL_RED:
switch(type)
{
case GL_RGBA:
case GL_RGBA_INTEGER:
return clientVersion >= 3;
case GL_UNSIGNED_BYTE:
case GL_BYTE:
case GL_HALF_FLOAT:
case GL_FLOAT:
break;
default:
return false;
return error(GL_INVALID_OPERATION, 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)
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_UNSIGNED_SHORT_5_6_5:
return (format == GL_RGB);
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
if(clientVersion < 3)
break;
case GL_DEPTH_COMPONENT:
switch(type)
{
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:
return (format == GL_DEPTH_STENCIL_OES);
break;
default:
return false;
UNREACHABLE(format);
return error(GL_INVALID_ENUM, false);
}
return true;
}
bool IsColorRenderable(GLenum internalformat, GLint clientVersion)
......@@ -1301,7 +1377,7 @@ namespace es2sw
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;
......
......@@ -51,7 +51,7 @@ namespace es2
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);
......
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