Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98480 --- src/compiler/glsl/glsl_parser.yy | 5 +-- src/compiler/glsl/glsl_parser_extras.cpp | 58 ++++++++++++++++++++++++++++++++ src/compiler/glsl/glsl_parser_extras.h | 4 +++ src/mesa/main/extensions_table.h | 1 + src/mesa/main/mtypes.h | 1 + src/mesa/main/shaderimage.c | 22 ++++++++---- 6 files changed, 83 insertions(+), 8 deletions(-)
diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy index 7d709c7..0055c7d 100644 --- a/src/compiler/glsl/glsl_parser.yy +++ b/src/compiler/glsl/glsl_parser.yy @@ -1339,8 +1339,9 @@ layout_qualifier_id: }; 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->check_additional_es31_image_format(map[i].format)) && 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 db659adf..8d639e6 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" @@ -355,6 +356,62 @@ _mesa_glsl_parse_state::check_version(unsigned required_glsl_version, } /** + * Determines whether a given format is supported using the + * GL_NV_image_formats extension. + */ +bool +_mesa_glsl_parse_state::check_additional_es31_image_format(GLenum format) const +{ + if (!this->NV_image_formats_enable || !is_version(0, 310)) + return false; + + switch (format) { + case GL_RG32F: + case GL_RG16F: + case GL_R11F_G11F_B10F: + case GL_R16F: + case GL_RGB10_A2: + case GL_RG8: + case GL_RG8_SNORM: + case GL_R8: + case GL_R8_SNORM: + return true; + + case GL_RG32I: + case GL_RG16I: + case GL_RG8I: + case GL_R16I: + case GL_R8I: + return true; + + case GL_RGB10_A2UI: + case GL_RG32UI: + case GL_RG16UI: + case GL_RG8UI: + case GL_R16UI: + case GL_R8UI: + return true; + + case GL_R16: + case GL_R16_SNORM: + case GL_RG16: + case GL_RG16_SNORM: + case GL_RGBA16: + case GL_RGBA16_SNORM: + /** + * GL_NV_image_formats tells us that we should not expose any of the + * normalized 16bits formats unless we have GL_EXT_texture_norm16 or + * equivalent functionality. Since we don't have support for that + * extension, just disable those for now. + */ + return false; + + default: + return false; + } +} + +/** * Process a GLSL #version directive. * * \param version is the integer that follows the #version token. @@ -687,6 +744,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 53abbbc..a3e1aa5 100644 --- a/src/compiler/glsl/glsl_parser_extras.h +++ b/src/compiler/glsl/glsl_parser_extras.h @@ -204,6 +204,8 @@ struct _mesa_glsl_parse_state { return true; } + bool check_additional_es31_image_format(GLenum format) const; + bool has_atomic_counters() const { return ARB_shader_atomic_counters_enable || is_version(420, 310); @@ -765,6 +767,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 2dbd7da..f58f2ad 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 , NV_image_formats , GLL, GLC, 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/mtypes.h b/src/mesa/main/mtypes.h index 08f72e0..2485881 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3924,6 +3924,7 @@ struct gl_extensions GLboolean MESA_ycbcr_texture; GLboolean NV_conditional_render; GLboolean NV_fog_distance; + GLboolean NV_image_formats; GLboolean NV_point_sprite; GLboolean NV_primitive_restart; GLboolean NV_texture_barrier; diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c index db36e3b..5d866ea 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 _mesa_is_desktop_gl(ctx) || ctx->Extensions.NV_image_formats; + + /* 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.10.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev