[Mesa-dev] [PATCH 05/11] mesa: Validate internal format and format type first to provide accurate error code

Eduardo Lima Mitev elima at igalia.com
Mon Jan 19 03:32:11 PST 2015


The specification states that glTexImage2D and glTexImage3D should return
GL_INVALID_VALUE if the internal format is invalid, and GL_INVALID_ENUM is
the format type is invalid. However, current error check only considers the
combination of format, type and internal format; which returns a
GL_INVALID_OPERATION error when invalid.

Fixes 2 dEQP tests:
* dEQP-GLES3.functional.negative_api.texture.teximage2d
* dEQP-GLES3.functional.negative_api.texture.teximage3d
---
 src/mesa/main/glformats.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 114 insertions(+)

diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
index 06f9aaf..5cec90d 100644
--- a/src/mesa/main/glformats.c
+++ b/src/mesa/main/glformats.c
@@ -2012,6 +2012,112 @@ _mesa_es_error_check_format_and_type(GLenum format, GLenum type,
    return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
 }
 
+/**
+ * Check that internal format is a valid enum for OpenGL ES 3.
+ * \return TRUE if valid, FALSE otherwise.
+ */
+static GLboolean
+_mesa_es3_is_valid_internal_format(GLenum internalFormat)
+{
+   switch (internalFormat) {
+   case GL_RGB:
+   case GL_RGBA:
+   case GL_LUMINANCE_ALPHA:
+   case GL_LUMINANCE:
+   case GL_ALPHA:
+   case GL_R8:
+   case GL_R8_SNORM:
+   case GL_R16F:
+   case GL_R32F:
+   case GL_R8UI:
+   case GL_R8I:
+   case GL_R16UI:
+   case GL_R16I:
+   case GL_R32UI:
+   case GL_R32I:
+   case GL_RG8:
+   case GL_RG8_SNORM:
+   case GL_RG16F:
+   case GL_RG32F:
+   case GL_RG8UI:
+   case GL_RG8I:
+   case GL_RG16UI:
+   case GL_RG16I:
+   case GL_RG32UI:
+   case GL_RG32I:
+   case GL_RGB8:
+   case GL_SRGB8:
+   case GL_RGB565:
+   case GL_RGB8_SNORM:
+   case GL_R11F_G11F_B10F:
+   case GL_RGB9_E5:
+   case GL_RGB16F:
+   case GL_RGB32F:
+   case GL_RGB8UI:
+   case GL_RGB8I:
+   case GL_RGB16UI:
+   case GL_RGB16I:
+   case GL_RGB32UI:
+   case GL_RGB32I:
+   case GL_RGBA8:
+   case GL_SRGB8_ALPHA8:
+   case GL_RGBA8_SNORM:
+   case GL_RGB5_A1:
+   case GL_RGBA4:
+   case GL_RGB10_A2:
+   case GL_RGBA16F:
+   case GL_RGBA32F:
+   case GL_RGBA8UI:
+   case GL_RGBA8I:
+   case GL_RGB10_A2UI:
+   case GL_RGBA16UI:
+   case GL_RGBA16I:
+   case GL_RGBA32I:
+   case GL_RGBA32UI:
+   case GL_DEPTH_COMPONENT16:
+   case GL_DEPTH_COMPONENT24:
+   case GL_DEPTH_COMPONENT32F:
+   case GL_DEPTH24_STENCIL8:
+   case GL_DEPTH32F_STENCIL8:
+      break;
+   default:
+      return GL_FALSE;
+   }
+
+   return GL_TRUE;
+}
+
+/**
+ * Check that format type is a valid enum for OpenGL ES 3.
+ * \return TRUE if valid, FALSE otherwise.
+ */
+static GLboolean
+_mesa_es3_is_valid_format_type(GLenum type)
+{
+   switch (type) {
+   case GL_UNSIGNED_BYTE:
+   case GL_UNSIGNED_SHORT_5_6_5:
+   case GL_UNSIGNED_SHORT_4_4_4_4:
+   case GL_UNSIGNED_SHORT_5_5_5_1:
+   case GL_BYTE:
+   case GL_HALF_FLOAT:
+   case GL_FLOAT:
+   case GL_UNSIGNED_SHORT:
+   case GL_SHORT:
+   case GL_UNSIGNED_INT:
+   case GL_INT:
+   case GL_UNSIGNED_INT_10F_11F_11F_REV:
+   case GL_UNSIGNED_INT_5_9_9_9_REV:
+   case GL_UNSIGNED_INT_2_10_10_10_REV:
+   case GL_UNSIGNED_INT_24_8:
+   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
+      break;
+   default:
+      return GL_FALSE;
+   }
+
+   return GL_TRUE;
+}
 
 /**
  * Do error checking of format/type combinations for OpenGL ES 3
@@ -2022,6 +2128,14 @@ GLenum
 _mesa_es3_error_check_format_and_type(GLenum format, GLenum type,
                                       GLenum internalFormat)
 {
+   if (!_mesa_es3_is_valid_format_type(type)) {
+      return GL_INVALID_ENUM;
+   }
+
+   if (!_mesa_es3_is_valid_internal_format(internalFormat)) {
+      return GL_INVALID_VALUE;
+   }
+
    switch (format) {
    case GL_RGBA:
       switch (type) {
-- 
2.1.3



More information about the mesa-dev mailing list