mesa/st: Track complete access qualifier for images
authorRob Clark <robdclark@chromium.org>
Mon, 9 Jan 2023 19:23:39 +0000 (11:23 -0800)
committerMarge Bot <emma+marge@anholt.net>
Wed, 11 Jan 2023 20:09:01 +0000 (20:09 +0000)
Don't turn gl_access_qualifier coming from NIR back into GL enums,
losing information in the process.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20612>

src/compiler/glsl/gl_nir_link_uniforms.c
src/compiler/glsl/serialize.cpp
src/mesa/main/shader_types.h
src/mesa/main/texturebindless.c
src/mesa/state_tracker/st_atom_image.c
src/mesa/state_tracker/st_draw_feedback.c
src/mesa/state_tracker/st_texture.c

index 975ddca..f972139 100644 (file)
@@ -830,12 +830,6 @@ update_uniforms_shader_info(struct gl_shader_program *prog,
       /* Set image access qualifiers */
       enum gl_access_qualifier image_access =
          state->current_var->data.access;
-      const GLenum access =
-         (image_access & ACCESS_NON_WRITEABLE) ?
-         ((image_access & ACCESS_NON_READABLE) ? GL_NONE :
-                                                 GL_READ_ONLY) :
-         ((image_access & ACCESS_NON_READABLE) ? GL_WRITE_ONLY :
-                                                 GL_READ_WRITE);
 
       int image_index;
       if (state->current_var->data.bindless) {
@@ -850,7 +844,7 @@ update_uniforms_shader_info(struct gl_shader_program *prog,
 
          for (unsigned j = sh->Program->sh.NumBindlessImages;
               j < state->next_bindless_image_index; j++) {
-            sh->Program->sh.BindlessImages[j].access = access;
+            sh->Program->sh.BindlessImages[j].image_access = image_access;
          }
 
          sh->Program->sh.NumBindlessImages = state->next_bindless_image_index;
@@ -866,7 +860,7 @@ update_uniforms_shader_info(struct gl_shader_program *prog,
 
          for (unsigned i = image_index;
               i < MIN2(state->next_image_index, MAX_IMAGE_UNIFORMS); i++) {
-            sh->Program->sh.ImageAccess[i] = access;
+            sh->Program->sh.image_access[i] = image_access;
          }
       }
 
index 64b11ce..c8b55d8 100644 (file)
@@ -1111,8 +1111,8 @@ write_shader_metadata(struct blob *metadata, gl_linked_shader *shader)
    blob_write_uint32(metadata, glprog->ExternalSamplersUsed);
    blob_write_uint32(metadata, glprog->sh.ShaderStorageBlocksWriteAccess);
 
-   blob_write_bytes(metadata, glprog->sh.ImageAccess,
-                    sizeof(glprog->sh.ImageAccess));
+   blob_write_bytes(metadata, glprog->sh.image_access,
+                    sizeof(glprog->sh.image_access));
    blob_write_bytes(metadata, glprog->sh.ImageUnits,
                     sizeof(glprog->sh.ImageUnits));
 
@@ -1163,8 +1163,8 @@ read_shader_metadata(struct blob_reader *metadata,
    glprog->ExternalSamplersUsed = blob_read_uint32(metadata);
    glprog->sh.ShaderStorageBlocksWriteAccess = blob_read_uint32(metadata);
 
-   blob_copy_bytes(metadata, (uint8_t *) glprog->sh.ImageAccess,
-                   sizeof(glprog->sh.ImageAccess));
+   blob_copy_bytes(metadata, (uint8_t *) glprog->sh.image_access,
+                   sizeof(glprog->sh.image_access));
    blob_copy_bytes(metadata, (uint8_t *) glprog->sh.ImageUnits,
                    sizeof(glprog->sh.ImageUnits));
 
index 364af97..9222ae3 100644 (file)
@@ -604,16 +604,9 @@ struct gl_program
           */
          GLubyte ImageUnits[MAX_IMAGE_UNIFORMS];
 
-         /**
-          * Access qualifier specified in the shader for each image uniform
-          * index.  Either \c GL_READ_ONLY, \c GL_WRITE_ONLY, \c
-          * GL_READ_WRITE, or \c GL_NONE to indicate both read-only and
-          * write-only.
-          *
-          * It may be different, though only more strict than the value of
-          * \c gl_image_unit::Access for the corresponding image unit.
+         /** Access qualifier from linked shader
           */
-         GLenum16 ImageAccess[MAX_IMAGE_UNIFORMS];
+         enum gl_access_qualifier image_access[MAX_IMAGE_UNIFORMS];
 
          GLuint NumUniformBlocks;
          struct gl_uniform_block **UniformBlocks;
@@ -924,10 +917,9 @@ struct gl_bindless_image
    /** Whether this bindless image is bound to a unit. */
    GLboolean bound;
 
-   /** Access qualifier (GL_READ_WRITE, GL_READ_ONLY, GL_WRITE_ONLY, or
-    * GL_NONE to indicate both read-only and write-only)
+   /** Access qualifier from linked shader
     */
-   GLenum16 access;
+   enum gl_access_qualifier image_access;
 
    /** Pointer to the base of the data. */
    GLvoid *data;
index 16a29aa..c8e3031 100644 (file)
@@ -365,7 +365,7 @@ get_image_handle(struct gl_context *ctx, struct gl_texture_object *texObj,
 
    /* Request a new image handle from the driver. */
    struct pipe_image_view image;
-   st_convert_image(st_context(ctx), &imgObj, &image, GL_READ_WRITE);
+   st_convert_image(st_context(ctx), &imgObj, &image, 0);
    handle = ctx->pipe->create_image_handle(ctx->pipe, &image);
    if (!handle) {
       mtx_unlock(&ctx->Shared->HandlesMutex);
index db0bc99..5331f90 100644 (file)
@@ -49,7 +49,7 @@
  */
 void
 st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
-                 struct pipe_image_view *img, unsigned shader_access)
+                 struct pipe_image_view *img, enum gl_access_qualifier shader_access)
 {
    struct gl_texture_object *stObj = u->TexObj;
 
@@ -69,22 +69,11 @@ st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
       unreachable("bad gl_image_unit::Access");
    }
 
-   switch (shader_access) {
-   case GL_NONE:
-      img->shader_access = 0;
-      break;
-   case GL_READ_ONLY:
-      img->shader_access = PIPE_IMAGE_ACCESS_READ;
-      break;
-   case GL_WRITE_ONLY:
-      img->shader_access = PIPE_IMAGE_ACCESS_WRITE;
-      break;
-   case GL_READ_WRITE:
-      img->shader_access = PIPE_IMAGE_ACCESS_READ_WRITE;
-      break;
-   default:
-      unreachable("bad gl_image_unit::Access");
-   }
+   img->shader_access = 0;
+   if (!(shader_access & ACCESS_NON_READABLE))
+      img->shader_access |= PIPE_IMAGE_ACCESS_READ;
+   if (!(shader_access & ACCESS_NON_WRITEABLE))
+      img->shader_access |= PIPE_IMAGE_ACCESS_WRITE;
 
    if (stObj->Target == GL_TEXTURE_BUFFER) {
       struct gl_buffer_object *stbuf = stObj->BufferObject;
@@ -141,7 +130,7 @@ void
 st_convert_image_from_unit(const struct st_context *st,
                            struct pipe_image_view *img,
                            GLuint imgUnit,
-                           unsigned shader_access)
+                           enum gl_access_qualifier image_access)
 {
    struct gl_image_unit *u = &st->ctx->ImageUnits[imgUnit];
 
@@ -150,7 +139,7 @@ st_convert_image_from_unit(const struct st_context *st,
       return;
    }
 
-   st_convert_image(st, u, img, shader_access);
+   st_convert_image(st, u, img, image_access);
 }
 
 static void
@@ -169,7 +158,7 @@ st_bind_images(struct st_context *st, struct gl_program *prog,
       struct pipe_image_view *img = &images[i];
 
       st_convert_image_from_unit(st, img, prog->sh.ImageUnits[i],
-                                 prog->sh.ImageAccess[i]);
+                                 prog->sh.image_access[i]);
    }
 
    struct pipe_context *pipe = st->pipe;
index 341f5af..b109e5a 100644 (file)
@@ -355,7 +355,7 @@ st_feedback_draw_vbo(struct gl_context *ctx,
       struct pipe_image_view *img = &images[i];
 
       st_convert_image_from_unit(st, img, prog->sh.ImageUnits[i],
-                                 prog->sh.ImageAccess[i]);
+                                 prog->sh.image_access[i]);
 
       struct pipe_resource *res = img->resource;
       if (!res)
index 65340b1..3f295bf 100644 (file)
@@ -550,7 +550,7 @@ st_create_image_handle_from_unit(struct st_context *st,
    struct pipe_context *pipe = st->pipe;
    struct pipe_image_view img;
 
-   st_convert_image_from_unit(st, &img, imgUnit, GL_READ_WRITE);
+   st_convert_image_from_unit(st, &img, imgUnit, 0);
 
    return pipe->create_image_handle(pipe, &img);
 }