mesa: GL_EXT_texture_norm16 extension plumbing
authorTapani Pälli <tapani.palli@intel.com>
Fri, 6 Apr 2018 07:57:57 +0000 (10:57 +0300)
committerTapani Pälli <tapani.palli@intel.com>
Wed, 25 Apr 2018 11:26:20 +0000 (14:26 +0300)
Patch enables use of short and unsigned short data for texture uploads,
rendering and reading of framebuffers within the restrictions specified
in GL_EXT_texture_norm16 spec.

Patch also enables those 16bit format layout qualifiers listed in
GL_NV_image_formats that depend on EXT_texture_norm16.

v2: expose extension with dummy_true
    fix layout qualifier map changes (Ilia Mirkin)

v3: use _mesa_has_EXT_texture_norm16, other fixes
    and cleanup (Ilia Mirkin)

v4: fix rest of the issues found

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Acked-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/glsl_parser.yy
src/mesa/main/extensions_table.h
src/mesa/main/genmipmap.c
src/mesa/main/glformats.c
src/mesa/main/glformats.h
src/mesa/main/readpix.c
src/mesa/main/shaderimage.c

index e5ea41d4dff2e880e5353965feef437bdd1fb79a..b4951a258aa125ea37ac5a015addbfad6edb1392 100644 (file)
@@ -1340,18 +1340,18 @@ layout_qualifier_id:
                { "r32i", GL_R32I, GLSL_TYPE_INT, 130, 310, false },
                { "r16i", GL_R16I, GLSL_TYPE_INT, 130, 0, true },
                { "r8i", GL_R8I, GLSL_TYPE_INT, 130, 0, true },
-               { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0, false },
+               { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0, true },
                { "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT, 130, 0, true },
                { "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT, 130, 310, false },
-               { "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0, false },
+               { "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0, true },
                { "rg8", GL_RG8, GLSL_TYPE_FLOAT, 130, 0, true },
-               { "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0, false },
+               { "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0, true },
                { "r8", GL_R8, GLSL_TYPE_FLOAT, 130, 0, true },
-               { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+               { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
                { "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT, 130, 310, false },
-               { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+               { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
                { "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
-               { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+               { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
                { "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true }
             };
 
index 492f7c3d20aec3775cb94105e19096c4053991f4..aec17750d58a79249c209a731427edf98edebbba 100644 (file)
@@ -283,6 +283,7 @@ EXT(EXT_texture_format_BGRA8888             , dummy_true
 EXT(EXT_texture_integer                     , EXT_texture_integer                    , GLL, GLC,  x ,  x , 2006)
 EXT(EXT_texture_lod_bias                    , dummy_true                             , GLL,  x , ES1,  x , 1999)
 EXT(EXT_texture_mirror_clamp                , EXT_texture_mirror_clamp               , GLL, GLC,  x ,  x , 2004)
+EXT(EXT_texture_norm16                      , dummy_true                             ,  x ,  x ,  x ,  31, 2014)
 EXT(EXT_texture_object                      , dummy_true                             , GLL,  x ,  x ,  x , 1995)
 EXT(EXT_texture_rectangle                   , NV_texture_rectangle                   , GLL,  x ,  x ,  x , 2004)
 EXT(EXT_texture_rg                          , ARB_texture_rg                         ,  x ,  x ,  x , ES2, 2011)
index 488c32f810158138fc8337d4f1e7ef594823a959..fd20ea280656dc151ebdfa18b42d75eb3ddb5c34 100644 (file)
@@ -93,7 +93,7 @@ _mesa_is_valid_generate_texture_mipmap_internalformat(struct gl_context *ctx,
              internalformat == GL_LUMINANCE_ALPHA ||
              internalformat == GL_LUMINANCE || internalformat == GL_ALPHA ||
              internalformat == GL_BGRA_EXT ||
-             (_mesa_is_es3_color_renderable(internalformat) &&
+             (_mesa_is_es3_color_renderable(ctx, internalformat) &&
               _mesa_is_es3_texture_filterable(ctx, internalformat));
    }
 
index 1e797c24c2ac5fc2b8572eb04ee0a342b200e0aa..cba5e670db01546a56c63d547b4162d63add2108 100644 (file)
@@ -2857,6 +2857,17 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
             return GL_INVALID_OPERATION;
          break;
 
+      case GL_UNSIGNED_SHORT:
+         if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RGBA16)
+            return GL_INVALID_OPERATION;
+         break;
+
+      case GL_SHORT:
+         if (!_mesa_has_EXT_texture_norm16(ctx) ||
+             internalFormat != GL_RGBA16_SNORM)
+            return GL_INVALID_OPERATION;
+         break;
+
       case GL_UNSIGNED_SHORT_4_4_4_4:
          switch (internalFormat) {
          case GL_RGBA:
@@ -2984,6 +2995,17 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
             return GL_INVALID_OPERATION;
          break;
 
+      case GL_UNSIGNED_SHORT:
+         if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RGB16)
+            return GL_INVALID_OPERATION;
+         break;
+
+      case GL_SHORT:
+         if (!_mesa_has_EXT_texture_norm16(ctx) ||
+             internalFormat != GL_RGB16_SNORM)
+            return GL_INVALID_OPERATION;
+         break;
+
       case GL_UNSIGNED_SHORT_5_6_5:
          switch (internalFormat) {
          case GL_RGB:
@@ -3115,6 +3137,17 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
             return GL_INVALID_OPERATION;
          break;
 
+      case GL_UNSIGNED_SHORT:
+         if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RG16)
+            return GL_INVALID_OPERATION;
+         break;
+
+      case GL_SHORT:
+         if (!_mesa_has_EXT_texture_norm16(ctx) ||
+             internalFormat != GL_RG16_SNORM)
+            return GL_INVALID_OPERATION;
+         break;
+
       case GL_HALF_FLOAT:
       case GL_HALF_FLOAT_OES:
          switch (internalFormat) {
@@ -3205,6 +3238,17 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
             return GL_INVALID_OPERATION;
          break;
 
+      case GL_UNSIGNED_SHORT:
+         if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_R16)
+            return GL_INVALID_OPERATION;
+         break;
+
+      case GL_SHORT:
+         if (!_mesa_has_EXT_texture_norm16(ctx) ||
+             internalFormat != GL_R16_SNORM)
+            return GL_INVALID_OPERATION;
+         break;
+
       case GL_HALF_FLOAT:
       case GL_HALF_FLOAT_OES:
          switch (internalFormat) {
@@ -3704,7 +3748,8 @@ _mesa_tex_format_from_format_and_type(const struct gl_context *ctx,
  * is marked "Color Renderable" in Table 8.10 of the ES 3.2 specification.
  */
 bool
-_mesa_is_es3_color_renderable(GLenum internal_format)
+_mesa_is_es3_color_renderable(const struct gl_context *ctx,
+                              GLenum internal_format)
 {
    switch (internal_format) {
    case GL_R8:
@@ -3743,6 +3788,10 @@ _mesa_is_es3_color_renderable(GLenum internal_format)
    case GL_RGBA32I:
    case GL_RGBA32UI:
       return true;
+   case GL_R16:
+   case GL_RG16:
+   case GL_RGBA16:
+      return _mesa_has_EXT_texture_norm16(ctx);
    default:
       return false;
    }
@@ -3778,6 +3827,15 @@ _mesa_is_es3_texture_filterable(const struct gl_context *ctx,
    case GL_R11F_G11F_B10F:
    case GL_RGB9_E5:
       return true;
+   case GL_R16:
+   case GL_R16_SNORM:
+   case GL_RG16:
+   case GL_RG16_SNORM:
+   case GL_RGB16:
+   case GL_RGB16_SNORM:
+   case GL_RGBA16:
+   case GL_RGBA16_SNORM:
+      return _mesa_has_EXT_texture_norm16(ctx);
    case GL_R32F:
    case GL_RG32F:
    case GL_RGB32F:
index 844f1e270c01f6ab253947aac85afd59fc7fba35..5a21317159db43fe62d3448f8d0245bf55a19cb7 100644 (file)
@@ -155,7 +155,8 @@ _mesa_tex_format_from_format_and_type(const struct gl_context *ctx,
                                       GLenum gl_format, GLenum type);
 
 extern bool
-_mesa_is_es3_color_renderable(GLenum internal_format);
+_mesa_is_es3_color_renderable(const struct gl_context *ctx,
+                              GLenum internal_format);
 
 extern bool
 _mesa_is_es3_texture_filterable(const struct gl_context *ctx,
index 6ce340ddf9bbc8442aa515f669c60c96a7182868..a4eea3043d3fd780b308461fe9003227c9cf75c6 100644 (file)
@@ -901,7 +901,7 @@ _mesa_readpixels(struct gl_context *ctx,
 
 
 static GLenum
-read_pixels_es3_error_check(GLenum format, GLenum type,
+read_pixels_es3_error_check(struct gl_context *ctx, GLenum format, GLenum type,
                             const struct gl_renderbuffer *rb)
 {
    const GLenum internalFormat = rb->InternalFormat;
@@ -927,6 +927,16 @@ read_pixels_es3_error_check(GLenum format, GLenum type,
          return GL_NO_ERROR;
       if (internalFormat == GL_RGB10_A2UI && type == GL_UNSIGNED_BYTE)
          return GL_NO_ERROR;
+      if (type == GL_UNSIGNED_SHORT) {
+         switch (internalFormat) {
+         case GL_R16:
+         case GL_RG16:
+         case GL_RGB16:
+         case GL_RGBA16:
+            if (_mesa_has_EXT_texture_norm16(ctx))
+               return GL_NO_ERROR;
+         }
+      }
       break;
    case GL_BGRA:
       /* GL_EXT_read_format_bgra */
@@ -1049,7 +1059,7 @@ read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format,
                }
             }
          } else {
-            err = read_pixels_es3_error_check(format, type, rb);
+            err = read_pixels_es3_error_check(ctx, format, type, rb);
          }
 
          if (err != GL_NO_ERROR) {
index 596eadd4f85f30d4a9203fbf3cdc8578f275bf2b..feff8ccd91680d9ea03fbac896e4f7ed26c0bf4b 100644 (file)
@@ -430,9 +430,8 @@ _mesa_is_shader_image_format_supported(const struct gl_context *ctx,
     * ARB_shader_image_load_store extension, c.f. table 3.21 of the OpenGL 4.2
     * specification.
     *
-    * These can be supported by GLES 3.1 with GL_NV_image_formats &
-    * GL_EXT_texture_norm16 extensions but we don't have support for the
-    * latter in Mesa yet.
+    * Following formats are supported by GLES 3.1 with GL_NV_image_formats &
+    * GL_EXT_texture_norm16 extensions.
     */
    case GL_RGBA16:
    case GL_RGBA16_SNORM:
@@ -440,7 +439,7 @@ _mesa_is_shader_image_format_supported(const struct gl_context *ctx,
    case GL_RG16_SNORM:
    case GL_R16:
    case GL_R16_SNORM:
-      return _mesa_is_desktop_gl(ctx);
+      return _mesa_is_desktop_gl(ctx) || _mesa_has_EXT_texture_norm16(ctx);
 
    default:
       return false;