[Mesa-dev] [PATCH 1/2] mesa: GL_EXT_texture_norm16 extension plumbing

Tapani Pälli tapani.palli at intel.com
Mon Apr 16 23:36:24 UTC 2018


Hi;

On 16.04.2018 18:19, Ilia Mirkin wrote:
> You never check EXT_texture_norm16 anywhere... is that right? Should
> probably respect that in the _mesa_is_es3_* helpers. Also what about

Oops that is very correct, will add the checks.

> shader support? I see no mention in the spec that these should be
> usable as images, except with NV_image_formats is enabled. You're just
> exposing them no matter what in ES 3.10.

Layout qualifiers added by the spec are exposed only when 3.10 ES and 
NV_image_formats are both there, the boolean in map below (last column) 
is the check for NV_image_formats, without it you'll get compilation error.


> On Mon, Apr 16, 2018 at 11:04 AM, Tapani Pälli <tapani.palli at intel.com> wrote:
>> 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.
>>
>> Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
>> ---
>>   src/compiler/glsl/glsl_parser.yy | 12 +++++-----
>>   src/mesa/main/extensions_table.h |  1 +
>>   src/mesa/main/glformats.c        | 51 ++++++++++++++++++++++++++++++++++++++++
>>   src/mesa/main/mtypes.h           |  1 +
>>   src/mesa/main/readpix.c          | 10 ++++++++
>>   src/mesa/main/shaderimage.c      |  7 +++---
>>   6 files changed, 72 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy
>> index e5ea41d4df..d6c6f39f6c 100644
>> --- a/src/compiler/glsl/glsl_parser.yy
>> +++ b/src/compiler/glsl/glsl_parser.yy
>> @@ -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, 310, 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, 310, 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, 310, 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, 310, 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, 310, 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, 310, true },
>>                  { "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true }
>>               };
>>
>> diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
>> index 492f7c3d20..ce5dd80886 100644
>> --- a/src/mesa/main/extensions_table.h
>> +++ b/src/mesa/main/extensions_table.h
>> @@ -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                      , EXT_texture_norm16                     ,  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)
>> diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
>> index 1e797c24c2..b87e4e9e60 100644
>> --- a/src/mesa/main/glformats.c
>> +++ b/src/mesa/main/glformats.c
>> @@ -2857,6 +2857,16 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
>>               return GL_INVALID_OPERATION;
>>            break;
>>
>> +      case GL_UNSIGNED_SHORT:
>> +         if (internalFormat != GL_RGBA16)
>> +            return GL_INVALID_OPERATION;
>> +         break;
>> +
>> +      case GL_SHORT:
>> +         if (internalFormat != GL_RGBA16_SNORM)
>> +            return GL_INVALID_OPERATION;
>> +         break;
>> +
>>         case GL_UNSIGNED_SHORT_4_4_4_4:
>>            switch (internalFormat) {
>>            case GL_RGBA:
>> @@ -2984,6 +2994,16 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
>>               return GL_INVALID_OPERATION;
>>            break;
>>
>> +      case GL_UNSIGNED_SHORT:
>> +         if (internalFormat != GL_RGB16)
>> +            return GL_INVALID_OPERATION;
>> +         break;
>> +
>> +      case GL_SHORT:
>> +         if (internalFormat != GL_RGB16_SNORM)
>> +            return GL_INVALID_OPERATION;
>> +         break;
>> +
>>         case GL_UNSIGNED_SHORT_5_6_5:
>>            switch (internalFormat) {
>>            case GL_RGB:
>> @@ -3115,6 +3135,16 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
>>               return GL_INVALID_OPERATION;
>>            break;
>>
>> +      case GL_UNSIGNED_SHORT:
>> +         if (internalFormat != GL_RG16)
>> +            return GL_INVALID_OPERATION;
>> +         break;
>> +
>> +      case GL_SHORT:
>> +         if (internalFormat != GL_RG16_SNORM)
>> +            return GL_INVALID_OPERATION;
>> +         break;
>> +
>>         case GL_HALF_FLOAT:
>>         case GL_HALF_FLOAT_OES:
>>            switch (internalFormat) {
>> @@ -3205,6 +3235,16 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx,
>>               return GL_INVALID_OPERATION;
>>            break;
>>
>> +      case GL_UNSIGNED_SHORT:
>> +         if (internalFormat != GL_R16)
>> +            return GL_INVALID_OPERATION;
>> +         break;
>> +
>> +      case GL_SHORT:
>> +         if (internalFormat != GL_R16_SNORM)
>> +            return GL_INVALID_OPERATION;
>> +         break;
>> +
>>         case GL_HALF_FLOAT:
>>         case GL_HALF_FLOAT_OES:
>>            switch (internalFormat) {
>> @@ -3718,8 +3758,11 @@ _mesa_is_es3_color_renderable(GLenum internal_format)
>>      case GL_RGB10_A2UI:
>>      case GL_SRGB8_ALPHA8:
>>      case GL_R16F:
>> +   case GL_R16:
>>      case GL_RG16F:
>> +   case GL_RG16:
>>      case GL_RGBA16F:
>> +   case GL_RGBA16:
>>      case GL_R32F:
>>      case GL_RG32F:
>>      case GL_RGBA32F:
>> @@ -3772,9 +3815,17 @@ _mesa_is_es3_texture_filterable(const struct gl_context *ctx,
>>      case GL_SRGB8:
>>      case GL_SRGB8_ALPHA8:
>>      case GL_R16F:
>> +   case GL_R16:
>> +   case GL_R16_SNORM:
>>      case GL_RG16F:
>> +   case GL_RG16:
>> +   case GL_RG16_SNORM:
>>      case GL_RGB16F:
>> +   case GL_RGB16:
>> +   case GL_RGB16_SNORM:
>>      case GL_RGBA16F:
>> +   case GL_RGBA16:
>> +   case GL_RGBA16_SNORM:
>>      case GL_R11F_G11F_B10F:
>>      case GL_RGB9_E5:
>>         return true;
>> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
>> index b65e7b2c3c..a9b3153365 100644
>> --- a/src/mesa/main/mtypes.h
>> +++ b/src/mesa/main/mtypes.h
>> @@ -4132,6 +4132,7 @@ struct gl_extensions
>>      GLboolean EXT_texture_filter_anisotropic;
>>      GLboolean EXT_texture_integer;
>>      GLboolean EXT_texture_mirror_clamp;
>> +   GLboolean EXT_texture_norm16;
>>      GLboolean EXT_texture_shared_exponent;
>>      GLboolean EXT_texture_snorm;
>>      GLboolean EXT_texture_sRGB;
>> diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c
>> index 6ce340ddf9..54f1e57377 100644
>> --- a/src/mesa/main/readpix.c
>> +++ b/src/mesa/main/readpix.c
>> @@ -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;
>> +      /* GL_EXT_texture_norm16 */
>> +      if (type == GL_UNSIGNED_SHORT) {
>> +         switch (internalFormat) {
>> +            case GL_R16:
>> +            case GL_RG16:
>> +            case GL_RGB16:
>> +            case GL_RGBA16:
>> +            return GL_NO_ERROR;
>> +         }
>> +      }
>>         break;
>>      case GL_BGRA:
>>         /* GL_EXT_read_format_bgra */
>> diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c
>> index 596eadd4f8..4348d120cb 100644
>> --- a/src/mesa/main/shaderimage.c
>> +++ b/src/mesa/main/shaderimage.c
>> @@ -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 true;
>>
>>      default:
>>         return false;
>> --
>> 2.13.6
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list