On Sat, Apr 21, 2018 at 3:25 AM, Tapani Pälli <tapani.pa...@intel.com> wrote: > > > On 20.04.2018 19:15, Ilia Mirkin wrote: >> >> On Fri, Apr 20, 2018 at 11:33 AM, Tapani Pälli <tapani.pa...@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. >>> >>> 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) >>> >>> Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> >>> --- >>> >>> Note, Piglit test "ext_texture_norm16-render" passes with these changes. >>> >>> src/compiler/glsl/glsl_parser.yy | 12 ++++---- >>> src/mesa/main/extensions_table.h | 1 + >>> src/mesa/main/genmipmap.c | 2 +- >>> src/mesa/main/glformats.c | 61 >>> +++++++++++++++++++++++++++++++++++++++- >>> src/mesa/main/glformats.h | 3 +- >>> src/mesa/main/readpix.c | 14 +++++++-- >>> src/mesa/main/shaderimage.c | 7 ++--- >>> 7 files changed, 85 insertions(+), 15 deletions(-) >>> >>> diff --git a/src/compiler/glsl/glsl_parser.yy >>> b/src/compiler/glsl/glsl_parser.yy >>> index e5ea41d4df..b4951a258a 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, 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 >>> } >>> }; >>> >>> diff --git a/src/mesa/main/extensions_table.h >>> b/src/mesa/main/extensions_table.h >>> index 492f7c3d20..aec17750d5 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 , 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) >>> diff --git a/src/mesa/main/genmipmap.c b/src/mesa/main/genmipmap.c >>> index 488c32f810..fd20ea2806 100644 >>> --- a/src/mesa/main/genmipmap.c >>> +++ b/src/mesa/main/genmipmap.c >>> @@ -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)); >>> } >>> >>> diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c >>> index 1e797c24c2..5473ec02df 100644 >>> --- a/src/mesa/main/glformats.c >>> +++ b/src/mesa/main/glformats.c >>> @@ -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,16 @@ _mesa_es3_error_check_format_and_type(const struct >>> gl_context *ctx, >>> return GL_INVALID_OPERATION; >>> break; >>> >>> + case GL_UNSIGNED_SHORT: >>> + if (ctx->Version < 31 || internalFormat != GL_R16) >> >> >> !_mesa_has_EXT_texture_norm16(ctx) (and below) > > > will fix > > >>> + return GL_INVALID_OPERATION; >>> + break; >>> + >>> + case GL_SHORT: >>> + if (ctx->Version < 31 || internalFormat != GL_R16_SNORM) >>> + return GL_INVALID_OPERATION; >>> + break; >>> + >>> case GL_HALF_FLOAT: >>> case GL_HALF_FLOAT_OES: >>> switch (internalFormat) { >>> @@ -3704,7 +3747,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 +3787,11 @@ _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: >>> + if (_mesa_has_EXT_texture_norm16(ctx)) >>> + return true; >>> default: >>> return false; >>> } >>> @@ -3778,6 +3827,16 @@ _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: >>> + if (_mesa_has_EXT_texture_norm16(ctx)) >>> + return true; >> >> >> Here and above, you fall through if it's false. Is that desirable? > > > yes, then we will return false like should happen without the extension
If you fall through here, it will go into the GL_R32F/etc case. Seems odd to do that... I think you just want return _mesa_has_EXT_texture_norm16(ctx) > > >>> case GL_R32F: >>> case GL_RG32F: >>> case GL_RGB32F: >>> diff --git a/src/mesa/main/glformats.h b/src/mesa/main/glformats.h >>> index 844f1e270c..5a21317159 100644 >>> --- a/src/mesa/main/glformats.h >>> +++ b/src/mesa/main/glformats.h >>> @@ -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, >>> diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c >>> index 6ce340ddf9..ff0647327e 100644 >>> --- a/src/mesa/main/readpix.c >>> +++ b/src/mesa/main/readpix.c >>> @@ -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)) >> >> >> This should be indented in. (i.e. the if should be indented, the case >> should remain as-is.) > > > will fix > >> With these minor fixes, this is >> >> Acked-by: Ilia Mirkin <imir...@alum.mit.edu> >> >> (I haven't done a thorough review of what all this should affect, but >> the changes that you do have seem fine.) > > > Thanks, it is about glTeximage2D, glGenerateMipmap, glReadPixels, rendering > to fbo with these formats and GL_EXT_copy_image. Those are tested by the > Piglit test I've sent. Parser changes get tested by NV_image_formats tests > in Piglit. > > > >>> + 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) { >>> diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c >>> index 596eadd4f8..ac4985d8b7 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 (_mesa_is_desktop_gl(ctx) || >>> _mesa_has_EXT_texture_norm16(ctx)); >>> >>> default: >>> return false; >>> -- >>> 2.13.6 >>> > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev