mesa: Expose GL_OES_required_internalformat on GLES contexts.
authorEric Anholt <eric@anholt.net>
Mon, 1 May 2017 16:28:33 +0000 (09:28 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 10 Oct 2017 16:31:29 +0000 (09:31 -0700)
This extension is effectively a backport of GLES3's internalformat
handling to GLES 1/2.  It guarantees that sized internalformats specified
for textures and renderbuffers have at least the specified size stored.
That's a pretty minimal requirement, so I think it can be dummy_true and
exposed as a standard in Mesa.

As a side effect, it also allows GL_RGB565 to be specified as a texture
format, not just as a renderbuffer.  Mesa had previously been allowing 565
textures, which angered DEQP in the absence of this extension being
exposed.

v2: Allow 2101010rev with sized internalformats even on GLES3, citing the
    extension spec.  Extend extension checks for GLES2 contexts exposing
    with texture_float, texture_half_float, and texture_rg.
v3: Fix ALPHA/LUMINANCE/LUMINANCE_ALPHA error checking (GLES3 CTS
    failures)
v4: Mark GL_RGB10 non-color-renderable on ES, fix A/L/LA errors on GLES2
    with float formats.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
docs/features.txt
src/mesa/main/extensions_table.h
src/mesa/main/fbobject.c
src/mesa/main/glformats.c
src/mesa/main/teximage.c

index 61fff7459b635f88308458ddc3c8a100f3056a7a..18dddc1aa3f65050c66a928933409e9c9e06b6cb 100644 (file)
@@ -319,7 +319,7 @@ Khronos, ARB, and OES extensions that are not part of any OpenGL or OpenGL ES ve
   GL_OES_depth_texture_cube_map                         DONE (all drivers that support GLSL 1.30+)
   GL_OES_EGL_image                                      DONE (all drivers)
   GL_OES_EGL_image_external_essl3                       not started
-  GL_OES_required_internalformat                        not started - GLES2 extension based on OpenGL ES 3.0 feature
+  GL_OES_required_internalformat                        DONE (all drivers)
   GL_OES_surfaceless_context                            DONE (all drivers)
   GL_OES_texture_compression_astc                       DONE (core only)
   GL_OES_texture_float                                  DONE (i965, r300, r600, radeonsi, nv30, nv50, nvc0, softpipe, llvmpipe)
index 7254cac89c67419636d9a9f5b6ace097336a5b77..c1c39f9a16d1110798c09e7d5d0c15c284d929c2 100644 (file)
@@ -376,6 +376,7 @@ EXT(OES_point_sprite                        , ARB_point_sprite
 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)
index f4552076a2e91cf6d48b0ed1a1ff087e89e03d1f..db8c207ceea871aae7e735a64a82fabfffeb855d 100644 (file)
@@ -729,6 +729,7 @@ is_format_color_renderable(const struct gl_context *ctx, mesa_format format,
    case GL_RGB8I:
    case GL_RGB8UI:
    case GL_SRGB8:
+   case GL_RGB10:
    case GL_RGB9_E5:
    case GL_RG8_SNORM:
    case GL_R8_SNORM:
index aec41f079935c10cd6a3d6022490c8b77165d5f8..7b4b405a814f45e70e7e0d0017fa9ca8c42ce977 100644 (file)
@@ -2779,7 +2779,7 @@ _mesa_es3_effective_internal_format_for_format_and_type(GLenum format,
 
 /**
  * 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
@@ -2842,7 +2842,10 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          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;
@@ -2850,7 +2853,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          break;
 
       case GL_BYTE:
-         if (internalFormat != GL_RGBA8_SNORM)
+         if (ctx->Version <= 20 || internalFormat != GL_RGBA8_SNORM)
             return GL_INVALID_OPERATION;
          break;
 
@@ -2876,9 +2879,11 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
 
       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;
@@ -2886,7 +2891,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          break;
 
       case GL_HALF_FLOAT:
-         if (internalFormat != GL_RGBA16F)
+         if (ctx->Version <= 20 || internalFormat != GL_RGBA16F)
             return GL_INVALID_OPERATION;
          break;
 
@@ -2894,6 +2899,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          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)
@@ -2912,6 +2919,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
       break;
 
    case GL_RGBA_INTEGER:
+      if (ctx->Version <= 20)
+         return GL_INVALID_OPERATION;
       switch (type) {
       case GL_UNSIGNED_BYTE:
          if (internalFormat != GL_RGBA8UI)
@@ -2960,7 +2969,10 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          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;
@@ -2968,7 +2980,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          break;
 
       case GL_BYTE:
-         if (internalFormat != GL_RGB8_SNORM)
+         if (ctx->Version <= 20 || internalFormat != GL_RGB8_SNORM)
             return GL_INVALID_OPERATION;
          break;
 
@@ -2983,16 +2995,18 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          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:
@@ -3009,6 +3023,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          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)
@@ -3025,7 +3041,16 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
 
       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;
@@ -3038,6 +3063,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
       break;
 
    case GL_RGB_INTEGER:
+      if (ctx->Version <= 20)
+         return GL_INVALID_OPERATION;
       switch (type) {
       case GL_UNSIGNED_BYTE:
          if (internalFormat != GL_RGB8UI)
@@ -3075,6 +3102,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
       break;
 
    case GL_RG:
+      if (!ctx->Extensions.ARB_texture_rg)
+         return GL_INVALID_OPERATION;
       switch (type) {
       case GL_UNSIGNED_BYTE:
          if (internalFormat != GL_RG8)
@@ -3122,6 +3151,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
       break;
 
    case GL_RG_INTEGER:
+      if (ctx->Version <= 20)
+         return GL_INVALID_OPERATION;
       switch (type) {
       case GL_UNSIGNED_BYTE:
          if (internalFormat != GL_RG8UI)
@@ -3159,6 +3190,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
       break;
 
    case GL_RED:
+      if (!ctx->Extensions.ARB_texture_rg)
+         return GL_INVALID_OPERATION;
       switch (type) {
       case GL_UNSIGNED_BYTE:
          if (internalFormat != GL_R8)
@@ -3207,6 +3240,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
       break;
 
    case GL_RED_INTEGER:
+      if (ctx->Version <= 20)
+         return GL_INVALID_OPERATION;
       switch (type) {
       case GL_UNSIGNED_BYTE:
          if (internalFormat != GL_R8UI)
@@ -3263,7 +3298,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          break;
 
       case GL_FLOAT:
-         if (internalFormat != GL_DEPTH_COMPONENT32F)
+         if (ctx->Version <= 20 || internalFormat != GL_DEPTH_COMPONENT32F)
             return GL_INVALID_OPERATION;
          break;
 
@@ -3281,7 +3316,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
          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;
 
@@ -3303,15 +3338,27 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
    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;
index bb22b9a5df47454bcad69bb9232d8533432219e5..4ec6148bf42d16b05b925d9c9c096618fd44f104 100644 (file)
@@ -1731,28 +1731,15 @@ texture_format_error_check_gles(struct gl_context *ctx, GLenum format,
                                 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;