From 9a806d2d15d9ec9e11087e4bd7dd390e4263309c Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Thu, 3 Nov 2016 17:18:45 +0000 Subject: [PATCH] mesa: add NV_image_formats extension support This extension can be enabled automatically as it is a subset of ARB_shader_image_load_store. v2: Replace helper function by qualifier struct field (Ilia) Enable NV_image_formats using ARB_shader_image_load_store (Ilia) v3: Drop extension field from gl_extensions (Ilia) Release notes (Ilia) Signed-off-by: Lionel Landwerlin Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98480 Reviewed-by: Ilia Mirkin --- docs/relnotes/13.1.0.html | 8 ++- src/compiler/glsl/glsl_parser.yy | 86 +++++++++++++----------- src/compiler/glsl/glsl_parser_extras.cpp | 2 + src/compiler/glsl/glsl_parser_extras.h | 2 + src/mesa/main/extensions_table.h | 1 + src/mesa/main/shaderimage.c | 22 ++++-- 6 files changed, 72 insertions(+), 49 deletions(-) diff --git a/docs/relnotes/13.1.0.html b/docs/relnotes/13.1.0.html index 0bbf19d62eb..4f76cc287fe 100644 --- a/docs/relnotes/13.1.0.html +++ b/docs/relnotes/13.1.0.html @@ -44,12 +44,16 @@ Note: some of the new features are only available with certain drivers.

    -TBD. +
  • GL_NV_image_formats on any driver supporting GL_ARB_shader_image_load_store (i965, nvc0, radeonsi, softpipe)

Bug fixes

-TBD. +
    + +
  • Bug 98480 - Support R8 image texture in ES 3.1
  • + +

Changes

diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy index 7d709c78c57..a48dc68b00e 100644 --- a/src/compiler/glsl/glsl_parser.yy +++ b/src/compiler/glsl/glsl_parser.yy @@ -1296,51 +1296,55 @@ layout_qualifier_id: unsigned required_glsl; /** Minimum GLSL ES version required for the image format. */ unsigned required_essl; + /* NV_image_formats */ + bool nv_image_formats; } map[] = { - { "rgba32f", GL_RGBA32F, GLSL_TYPE_FLOAT, 130, 310 }, - { "rgba16f", GL_RGBA16F, GLSL_TYPE_FLOAT, 130, 310 }, - { "rg32f", GL_RG32F, GLSL_TYPE_FLOAT, 130, 0 }, - { "rg16f", GL_RG16F, GLSL_TYPE_FLOAT, 130, 0 }, - { "r11f_g11f_b10f", GL_R11F_G11F_B10F, GLSL_TYPE_FLOAT, 130, 0 }, - { "r32f", GL_R32F, GLSL_TYPE_FLOAT, 130, 310 }, - { "r16f", GL_R16F, GLSL_TYPE_FLOAT, 130, 0 }, - { "rgba32ui", GL_RGBA32UI, GLSL_TYPE_UINT, 130, 310 }, - { "rgba16ui", GL_RGBA16UI, GLSL_TYPE_UINT, 130, 310 }, - { "rgb10_a2ui", GL_RGB10_A2UI, GLSL_TYPE_UINT, 130, 0 }, - { "rgba8ui", GL_RGBA8UI, GLSL_TYPE_UINT, 130, 310 }, - { "rg32ui", GL_RG32UI, GLSL_TYPE_UINT, 130, 0 }, - { "rg16ui", GL_RG16UI, GLSL_TYPE_UINT, 130, 0 }, - { "rg8ui", GL_RG8UI, GLSL_TYPE_UINT, 130, 0 }, - { "r32ui", GL_R32UI, GLSL_TYPE_UINT, 130, 310 }, - { "r16ui", GL_R16UI, GLSL_TYPE_UINT, 130, 0 }, - { "r8ui", GL_R8UI, GLSL_TYPE_UINT, 130, 0 }, - { "rgba32i", GL_RGBA32I, GLSL_TYPE_INT, 130, 310 }, - { "rgba16i", GL_RGBA16I, GLSL_TYPE_INT, 130, 310 }, - { "rgba8i", GL_RGBA8I, GLSL_TYPE_INT, 130, 310 }, - { "rg32i", GL_RG32I, GLSL_TYPE_INT, 130, 0 }, - { "rg16i", GL_RG16I, GLSL_TYPE_INT, 130, 0 }, - { "rg8i", GL_RG8I, GLSL_TYPE_INT, 130, 0 }, - { "r32i", GL_R32I, GLSL_TYPE_INT, 130, 310 }, - { "r16i", GL_R16I, GLSL_TYPE_INT, 130, 0 }, - { "r8i", GL_R8I, GLSL_TYPE_INT, 130, 0 }, - { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0 }, - { "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT, 130, 0 }, - { "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT, 130, 310 }, - { "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0 }, - { "rg8", GL_RG8, GLSL_TYPE_FLOAT, 130, 0 }, - { "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0 }, - { "r8", GL_R8, GLSL_TYPE_FLOAT, 130, 0 }, - { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0 }, - { "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT, 130, 310 }, - { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0 }, - { "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT, 130, 0 }, - { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0 }, - { "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0 } + { "rgba32f", GL_RGBA32F, GLSL_TYPE_FLOAT, 130, 310, false }, + { "rgba16f", GL_RGBA16F, GLSL_TYPE_FLOAT, 130, 310, false }, + { "rg32f", GL_RG32F, GLSL_TYPE_FLOAT, 130, 0, true }, + { "rg16f", GL_RG16F, GLSL_TYPE_FLOAT, 130, 0, true }, + { "r11f_g11f_b10f", GL_R11F_G11F_B10F, GLSL_TYPE_FLOAT, 130, 0, true }, + { "r32f", GL_R32F, GLSL_TYPE_FLOAT, 130, 310, false }, + { "r16f", GL_R16F, GLSL_TYPE_FLOAT, 130, 0, true }, + { "rgba32ui", GL_RGBA32UI, GLSL_TYPE_UINT, 130, 310, false }, + { "rgba16ui", GL_RGBA16UI, GLSL_TYPE_UINT, 130, 310, false }, + { "rgb10_a2ui", GL_RGB10_A2UI, GLSL_TYPE_UINT, 130, 0, true }, + { "rgba8ui", GL_RGBA8UI, GLSL_TYPE_UINT, 130, 310, false }, + { "rg32ui", GL_RG32UI, GLSL_TYPE_UINT, 130, 0, true }, + { "rg16ui", GL_RG16UI, GLSL_TYPE_UINT, 130, 0, true }, + { "rg8ui", GL_RG8UI, GLSL_TYPE_UINT, 130, 0, true }, + { "r32ui", GL_R32UI, GLSL_TYPE_UINT, 130, 310, false }, + { "r16ui", GL_R16UI, GLSL_TYPE_UINT, 130, 0, true }, + { "r8ui", GL_R8UI, GLSL_TYPE_UINT, 130, 0, true }, + { "rgba32i", GL_RGBA32I, GLSL_TYPE_INT, 130, 310, false }, + { "rgba16i", GL_RGBA16I, GLSL_TYPE_INT, 130, 310, false }, + { "rgba8i", GL_RGBA8I, GLSL_TYPE_INT, 130, 310, false }, + { "rg32i", GL_RG32I, GLSL_TYPE_INT, 130, 0, true }, + { "rg16i", GL_RG16I, GLSL_TYPE_INT, 130, 0, true }, + { "rg8i", GL_RG8I, GLSL_TYPE_INT, 130, 0, true }, + { "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 }, + { "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 }, + { "rg8", GL_RG8, GLSL_TYPE_FLOAT, 130, 0, true }, + { "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0, false }, + { "r8", GL_R8, GLSL_TYPE_FLOAT, 130, 0, true }, + { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false }, + { "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT, 130, 310, false }, + { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false }, + { "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true }, + { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false }, + { "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true } }; for (unsigned i = 0; i < ARRAY_SIZE(map); i++) { - if (state->is_version(map[i].required_glsl, - map[i].required_essl) && + if ((state->is_version(map[i].required_glsl, + map[i].required_essl) || + (state->NV_image_formats_enable && + map[i].nv_image_formats)) && match_layout_qualifier($1, map[i].name, state) == 0) { $$.flags.q.explicit_image_format = 1; $$.image_format = map[i].format; diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp index 0cb3c124ea5..1f3ba2ced44 100644 --- a/src/compiler/glsl/glsl_parser_extras.cpp +++ b/src/compiler/glsl/glsl_parser_extras.cpp @@ -28,6 +28,7 @@ #include "main/core.h" /* for struct gl_context */ #include "main/context.h" #include "main/debug_output.h" +#include "main/formats.h" #include "main/shaderobj.h" #include "util/u_atomic.h" /* for p_atomic_cmpxchg */ #include "util/ralloc.h" @@ -687,6 +688,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = { EXT_AEP(EXT_texture_buffer), EXT_AEP(EXT_texture_cube_map_array), EXT(MESA_shader_integer_functions), + EXT(NV_image_formats), }; #undef EXT diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h index 53abbbc997f..d757c1d76b2 100644 --- a/src/compiler/glsl/glsl_parser_extras.h +++ b/src/compiler/glsl/glsl_parser_extras.h @@ -765,6 +765,8 @@ struct _mesa_glsl_parse_state { bool MESA_shader_framebuffer_fetch_non_coherent_warn; bool MESA_shader_integer_functions_enable; bool MESA_shader_integer_functions_warn; + bool NV_image_formats_enable; + bool NV_image_formats_warn; /*@}*/ /** Extensions supported by the OpenGL implementation. */ diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h index 036e62b23e5..d3ec551282c 100644 --- a/src/mesa/main/extensions_table.h +++ b/src/mesa/main/extensions_table.h @@ -315,6 +315,7 @@ EXT(NV_depth_clamp , ARB_depth_clamp EXT(NV_draw_buffers , dummy_true , x , x , x , ES2, 2011) EXT(NV_fbo_color_attachments , dummy_true , x , x , x , ES2, 2010) EXT(NV_fog_distance , NV_fog_distance , GLL, x , x , x , 2001) +EXT(NV_image_formats , ARB_shader_image_load_store , x , x , x , 31, 2014) EXT(NV_light_max_exponent , dummy_true , GLL, x , x , x , 1999) EXT(NV_packed_depth_stencil , dummy_true , GLL, GLC, x , x , 2000) EXT(NV_point_sprite , NV_point_sprite , GLL, GLC, x , x , 2001) diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c index db36e3bb101..5cce3acd157 100644 --- a/src/mesa/main/shaderimage.c +++ b/src/mesa/main/shaderimage.c @@ -401,7 +401,7 @@ _mesa_is_shader_image_format_supported(const struct gl_context *ctx, /* Formats supported on unextended desktop GL and the original * ARB_shader_image_load_store extension, c.f. table 3.21 of the OpenGL 4.2 - * specification. + * specification or by GLES 3.1 with GL_NV_image_formats extension. */ case GL_RG32F: case GL_RG16F: @@ -418,17 +418,27 @@ _mesa_is_shader_image_format_supported(const struct gl_context *ctx, case GL_RG8I: case GL_R16I: case GL_R8I: - case GL_RGBA16: case GL_RGB10_A2: - case GL_RG16: case GL_RG8: - case GL_R16: case GL_R8: + case GL_RG8_SNORM: + case GL_R8_SNORM: + return true; + + /* Formats supported on unextended desktop GL and the original + * 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. + */ + case GL_RGBA16: case GL_RGBA16_SNORM: + case GL_RG16: case GL_RG16_SNORM: - case GL_RG8_SNORM: + case GL_R16: case GL_R16_SNORM: - case GL_R8_SNORM: return _mesa_is_desktop_gl(ctx); default: -- 2.30.2