Mesa (main): mesa/st: do not expose ARB_shader_image_load_store if not fully implemented

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jan 13 09:47:53 UTC 2022


Module: Mesa
Branch: main
Commit: 3b81d2d30dab7eeac74236e9b04a014d0d9481d2
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3b81d2d30dab7eeac74236e9b04a014d0d9481d2

Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date:   Tue Dec 21 17:02:12 2021 +0100

mesa/st: do not expose ARB_shader_image_load_store if not fully implemented

So far we were checking ARB_shader_image_load_store is supported as
requirement to expose GLES 3.1.

But when this extension functionality was added in GLES 3.1 spec, it
was relaxed, and one of its requirements, the support for formatless
writing, was not included.

So this means that a driver that support all the extension
functionality except formatless writing, could expose GLES 3.1, but it
couldn't expose the extension itself (nor GL 4.2, which requires fully
implementation of the extension).

v2:
 - Add the same exposure treatment to ARB_shader_image_size (Ilia).

v3:
 - Remove dependency for OES_texture_buffer (Ilia).
 - Check image resources for GLES 3.1 (Ilia).

v4:
 - Check for MaxImageUniforms in compute shader (Ilia).
 - Check for max combined image uniforms/ssbo (Ilia).

v5:
 - Remove ARB_shader_image_load_store from check (Ilia).
 - ARB_shader_image_store and ARB_shader_image required for
   ARB_ES3_1_compatibility (Ilia).

Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
Reviewed-by: Emma Anholt <emma at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14288>

---

 src/compiler/glsl/linker.cpp           |  3 ++-
 src/mesa/main/shaderimage.c            |  3 ++-
 src/mesa/main/texparam.c               |  6 ++++--
 src/mesa/state_tracker/st_extensions.c | 10 ++++++----
 4 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index c8981ef2765..ee8bc9e2b70 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -3433,7 +3433,8 @@ check_image_resources(const struct gl_constants *consts,
    unsigned fragment_outputs = 0;
    unsigned total_shader_storage_blocks = 0;
 
-   if (!exts->ARB_shader_image_load_store)
+   if (!consts->MaxCombinedImageUniforms &&
+       !consts->MaxCombinedShaderStorageBlocks)
       return;
 
    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c
index 3067a9af9aa..df0a999dd29 100644
--- a/src/mesa/main/shaderimage.c
+++ b/src/mesa/main/shaderimage.c
@@ -805,7 +805,8 @@ _mesa_BindImageTextures(GLuint first, GLsizei count, const GLuint *textures)
 {
    GET_CURRENT_CONTEXT(ctx);
 
-   if (!ctx->Extensions.ARB_shader_image_load_store) {
+   if (!ctx->Extensions.ARB_shader_image_load_store &&
+       !_mesa_is_gles31(ctx)) {
       _mesa_error(ctx, GL_INVALID_OPERATION, "glBindImageTextures()");
       return;
    }
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index 7ac49ac73c4..5f8478048f5 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -2451,7 +2451,8 @@ get_tex_parameterfv(struct gl_context *ctx,
          break;
 
       case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
-         if (!ctx->Extensions.ARB_shader_image_load_store)
+         if (!ctx->Extensions.ARB_shader_image_load_store &&
+             !_mesa_is_gles31(ctx))
             goto invalid_pname;
          *params = (GLfloat) obj->Attrib.ImageFormatCompatibilityType;
          break;
@@ -2741,7 +2742,8 @@ get_tex_parameteriv(struct gl_context *ctx,
          break;
 
       case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
-         if (!ctx->Extensions.ARB_shader_image_load_store)
+         if (!ctx->Extensions.ARB_shader_image_load_store &&
+             !_mesa_is_gles31(ctx))
             goto invalid_pname;
          *params = obj->Attrib.ImageFormatCompatibilityType;
          break;
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index c77378f4b15..a3ade7a8e07 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -583,7 +583,8 @@ void st_init_limits(struct pipe_screen *screen,
          c->Program[MESA_SHADER_COMPUTE].MaxImageUniforms;
    c->MaxCombinedShaderOutputResources += c->MaxCombinedImageUniforms;
    c->MaxImageUnits = MAX_IMAGE_UNITS;
-   if (c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms) {
+   if (c->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms &&
+       screen->get_param(screen, PIPE_CAP_IMAGE_STORE_FORMATTED)) {
       extensions->ARB_shader_image_load_store = GL_TRUE;
       extensions->ARB_shader_image_size = GL_TRUE;
    }
@@ -1484,10 +1485,10 @@ void st_init_extensions(struct pipe_screen *screen,
    }
 
    extensions->OES_texture_buffer =
+      consts->Program[MESA_SHADER_COMPUTE].MaxImageUniforms &&
       extensions->ARB_texture_buffer_object &&
       extensions->ARB_texture_buffer_range &&
-      extensions->ARB_texture_buffer_object_rgb32 &&
-      extensions->ARB_shader_image_load_store;
+      extensions->ARB_texture_buffer_object_rgb32;
 
    extensions->EXT_framebuffer_sRGB =
          screen->get_param(screen, PIPE_CAP_DEST_SURFACE_SRGB_CONTROL) &&
@@ -1683,6 +1684,7 @@ void st_init_extensions(struct pipe_screen *screen,
     * these are redunant, but simpler to just have a (near-)exact copy here.
     */
    extensions->ARB_ES3_1_compatibility =
+      consts->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms &&
       extensions->ARB_ES3_compatibility &&
       extensions->ARB_arrays_of_arrays &&
       extensions->ARB_compute_shader &&
@@ -1715,10 +1717,10 @@ void st_init_extensions(struct pipe_screen *screen,
    consts->NoPrimitiveBoundingBoxOutput = true;
 
    extensions->ANDROID_extension_pack_es31a =
+      consts->Program[MESA_SHADER_FRAGMENT].MaxImageUniforms &&
       extensions->KHR_texture_compression_astc_ldr &&
       extensions->KHR_blend_equation_advanced &&
       extensions->OES_sample_variables &&
-      extensions->ARB_shader_image_load_store &&
       extensions->ARB_texture_stencil8 &&
       extensions->ARB_texture_multisample &&
       extensions->OES_copy_image &&



More information about the mesa-commit mailing list