EXT(OES_primitive_bounding_box , OES_primitive_bounding_box , x , x , x , 31, 2014)
EXT(OES_query_matrix , dummy_true , x , x , ES1, x , 2003)
EXT(OES_read_format , dummy_true , GLL, x , ES1, x , 2003)
+EXT(OES_required_internalformat , dummy_true , x , x , ES1, ES2, 2012)
EXT(OES_rgb8_rgba8 , dummy_true , x , x , ES1, ES2, 2005)
EXT(OES_sample_shading , OES_sample_variables , x , x , x , 30, 2014)
EXT(OES_sample_variables , OES_sample_variables , x , x , x , 30, 2014)
/**
* Do error checking of format/type combinations for OpenGL ES 3
- * glTex[Sub]Image.
+ * glTex[Sub]Image, or ES1/ES2 with GL_OES_required_internalformat.
* \return error code, or GL_NO_ERROR.
*/
GLenum
case GL_RGBA8:
case GL_RGB5_A1:
case GL_RGBA4:
+ break;
case GL_SRGB8_ALPHA8_EXT:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
break;
default:
return GL_INVALID_OPERATION;
break;
case GL_BYTE:
- if (internalFormat != GL_RGBA8_SNORM)
+ if (ctx->Version <= 20 || internalFormat != GL_RGBA8_SNORM)
return GL_INVALID_OPERATION;
break;
case GL_UNSIGNED_INT_2_10_10_10_REV:
switch (internalFormat) {
- case GL_RGBA: /* GL_EXT_texture_type_2_10_10_10_REV */
+ case GL_RGBA:
case GL_RGB10_A2:
case GL_RGB5_A1:
+ if (!ctx->Extensions.EXT_texture_type_2_10_10_10_REV)
+ return GL_INVALID_OPERATION;
break;
default:
return GL_INVALID_OPERATION;
break;
case GL_HALF_FLOAT:
- if (internalFormat != GL_RGBA16F)
+ if (ctx->Version <= 20 || internalFormat != GL_RGBA16F)
return GL_INVALID_OPERATION;
break;
switch (internalFormat) {
case GL_RGBA16F:
case GL_RGBA32F:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
break;
case GL_RGBA:
if (ctx->Extensions.OES_texture_float && internalFormat == format)
break;
case GL_RGBA_INTEGER:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
switch (type) {
case GL_UNSIGNED_BYTE:
if (internalFormat != GL_RGBA8UI)
case GL_RGB:
case GL_RGB8:
case GL_RGB565:
+ break;
case GL_SRGB8:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
break;
default:
return GL_INVALID_OPERATION;
break;
case GL_BYTE:
- if (internalFormat != GL_RGB8_SNORM)
+ if (ctx->Version <= 20 || internalFormat != GL_RGB8_SNORM)
return GL_INVALID_OPERATION;
break;
break;
case GL_UNSIGNED_INT_10F_11F_11F_REV:
- if (internalFormat != GL_R11F_G11F_B10F)
+ if (ctx->Version <= 20 || internalFormat != GL_R11F_G11F_B10F)
return GL_INVALID_OPERATION;
break;
case GL_UNSIGNED_INT_5_9_9_9_REV:
- if (internalFormat != GL_RGB9_E5)
+ if (ctx->Version <= 20 || internalFormat != GL_RGB9_E5)
return GL_INVALID_OPERATION;
break;
case GL_HALF_FLOAT:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
switch (internalFormat) {
case GL_RGB16F:
case GL_R11F_G11F_B10F:
case GL_RGB32F:
case GL_R11F_G11F_B10F:
case GL_RGB9_E5:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
break;
case GL_RGB:
if (ctx->Extensions.OES_texture_float && internalFormat == format)
case GL_UNSIGNED_INT_2_10_10_10_REV:
switch (internalFormat) {
- case GL_RGB: /* GL_EXT_texture_type_2_10_10_10_REV */
+ case GL_RGB:
+ case GL_RGB10:
+ case GL_RGB8:
+ case GL_RGB565:
+ /* GL_EXT_texture_type_2_10_10_10_REV allows GL_RGB even though
+ * GLES3 doesn't, and GL_OES_required_internalformat extends that
+ * to allow the sized RGB internalformats as well.
+ */
+ if (!ctx->Extensions.EXT_texture_type_2_10_10_10_REV)
+ return GL_INVALID_OPERATION;
break;
default:
return GL_INVALID_OPERATION;
break;
case GL_RGB_INTEGER:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
switch (type) {
case GL_UNSIGNED_BYTE:
if (internalFormat != GL_RGB8UI)
break;
case GL_RG:
+ if (!ctx->Extensions.ARB_texture_rg)
+ return GL_INVALID_OPERATION;
switch (type) {
case GL_UNSIGNED_BYTE:
if (internalFormat != GL_RG8)
break;
case GL_RG_INTEGER:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
switch (type) {
case GL_UNSIGNED_BYTE:
if (internalFormat != GL_RG8UI)
break;
case GL_RED:
+ if (!ctx->Extensions.ARB_texture_rg)
+ return GL_INVALID_OPERATION;
switch (type) {
case GL_UNSIGNED_BYTE:
if (internalFormat != GL_R8)
break;
case GL_RED_INTEGER:
+ if (ctx->Version <= 20)
+ return GL_INVALID_OPERATION;
switch (type) {
case GL_UNSIGNED_BYTE:
if (internalFormat != GL_R8UI)
break;
case GL_FLOAT:
- if (internalFormat != GL_DEPTH_COMPONENT32F)
+ if (ctx->Version <= 20 || internalFormat != GL_DEPTH_COMPONENT32F)
return GL_INVALID_OPERATION;
break;
break;
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
- if (internalFormat != GL_DEPTH32F_STENCIL8)
+ if (ctx->Version <= 20 || internalFormat != GL_DEPTH32F_STENCIL8)
return GL_INVALID_OPERATION;
break;
case GL_LUMINANCE_ALPHA:
switch (type) {
case GL_FLOAT:
- if (ctx->Extensions.OES_texture_float && internalFormat == format)
- break;
+ if (!ctx->Extensions.OES_texture_float || internalFormat != format)
+ return GL_INVALID_OPERATION;
+ break;
case GL_HALF_FLOAT_OES:
- if (ctx->Extensions.OES_texture_half_float && internalFormat == format)
- break;
- default:
- if (type != GL_UNSIGNED_BYTE || format != internalFormat)
+ if (!ctx->Extensions.OES_texture_half_float || internalFormat != format)
return GL_INVALID_OPERATION;
+ break;
+ case GL_UNSIGNED_BYTE:
+ if (!(format == internalFormat ||
+ (format == GL_ALPHA && internalFormat == GL_ALPHA8) ||
+ (format == GL_LUMINANCE && internalFormat == GL_LUMINANCE8) ||
+ (format == GL_LUMINANCE_ALPHA &&
+ ((internalFormat == GL_LUMINANCE8_ALPHA8) ||
+ (internalFormat == GL_LUMINANCE4_ALPHA4))))) {
+ return GL_INVALID_OPERATION;
+ }
+ break;
+ default:
+ return GL_INVALID_OPERATION;
}
+ break;
}
return GL_NO_ERROR;
GLenum type, GLenum internalFormat,
GLuint dimensions, const char *callerName)
{
- GLenum err;
-
- if (_mesa_is_gles3(ctx)) {
- err = _mesa_es3_error_check_format_and_type(ctx, format, type,
- internalFormat);
- if (err != GL_NO_ERROR) {
- _mesa_error(ctx, err,
- "%s(format = %s, type = %s, internalformat = %s)",
- callerName, _mesa_enum_to_string(format),
- _mesa_enum_to_string(type),
- _mesa_enum_to_string(internalFormat));
- return true;
- }
- }
- else {
- err = _mesa_es_error_check_format_and_type(ctx, format, type, dimensions);
- if (err != GL_NO_ERROR) {
- _mesa_error(ctx, err, "%s(format = %s, type = %s)",
- callerName, _mesa_enum_to_string(format),
- _mesa_enum_to_string(type));
- return true;
- }
+ GLenum err = _mesa_es3_error_check_format_and_type(ctx, format, type,
+ internalFormat);
+ if (err != GL_NO_ERROR) {
+ _mesa_error(ctx, err,
+ "%s(format = %s, type = %s, internalformat = %s)",
+ callerName, _mesa_enum_to_string(format),
+ _mesa_enum_to_string(type),
+ _mesa_enum_to_string(internalFormat));
+ return true;
}
return false;