st/mesa: Record shader access qualifiers for images
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 2 Oct 2018 03:16:59 +0000 (22:16 -0500)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 23 Oct 2018 09:36:24 +0000 (02:36 -0700)
They're not required to be the same as the access flag on the image
unit.  For hardware that does shader image lowering based on the
qualifier (Intel), it may be required for state setup.

v2: (by Kenneth Graunke, incorporating feedback from Marek Olšák)
 - Reduce both access and shader_access to uint16_t to avoid making
   the pipe_image_view structure larger.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/include/pipe/p_state.h
src/mesa/state_tracker/st_atom_image.c
src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_texture.c
src/mesa/state_tracker/st_texture.h

index 95a18a72b5cff3f9dc36cbcac9cb0375c115b31d..fd670345aad3924dde3e345e917175b8b2635d15 100644 (file)
@@ -484,7 +484,8 @@ struct pipe_image_view
 {
    struct pipe_resource *resource; /**< resource into which this is a view  */
    enum pipe_format format;      /**< typed PIPE_FORMAT_x */
-   unsigned access;              /**< PIPE_IMAGE_ACCESS_x */
+   uint16_t access;              /**< PIPE_IMAGE_ACCESS_x */
+   uint16_t shader_access;       /**< PIPE_IMAGE_ACCESS_x */
 
    union {
       struct {
index 421c926cf04163628feb18a7d8574ff0be74aa4f..db3539259cecd47a5b9a44ac819aa68072c75054 100644 (file)
@@ -50,7 +50,7 @@
  */
 void
 st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
-                 struct pipe_image_view *img)
+                 struct pipe_image_view *img, unsigned shader_access)
 {
    struct st_texture_object *stObj = st_texture_object(u->TexObj);
 
@@ -70,6 +70,23 @@ 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");
+   }
+
    if (stObj->base.Target == GL_TEXTURE_BUFFER) {
       struct st_buffer_object *stbuf =
          st_buffer_object(stObj->base.BufferObject);
@@ -125,7 +142,8 @@ st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
 void
 st_convert_image_from_unit(const struct st_context *st,
                            struct pipe_image_view *img,
-                           GLuint imgUnit)
+                           GLuint imgUnit,
+                           unsigned shader_access)
 {
    struct gl_image_unit *u = &st->ctx->ImageUnits[imgUnit];
 
@@ -134,7 +152,7 @@ st_convert_image_from_unit(const struct st_context *st,
       return;
    }
 
-   st_convert_image(st, u, img);
+   st_convert_image(st, u, img, shader_access);
 }
 
 static void
@@ -153,7 +171,8 @@ st_bind_images(struct st_context *st, struct gl_program *prog,
    for (i = 0; i < prog->info.num_images; i++) {
       struct pipe_image_view *img = &images[i];
 
-      st_convert_image_from_unit(st, img, prog->sh.ImageUnits[i]);
+      st_convert_image_from_unit(st, img, prog->sh.ImageUnits[i],
+                                 prog->sh.ImageAccess[i]);
    }
    cso_set_shader_images(st->cso_context, shader_type, 0,
                          prog->info.num_images, images);
index e6e27a852f51d84bccd9c136fc2ce431e4ea6ae9..b8cc616d8f2801e46a2e6e8779dd20701da84164 100644 (file)
@@ -3237,7 +3237,7 @@ st_NewImageHandle(struct gl_context *ctx, struct gl_image_unit *imgObj)
    struct pipe_context *pipe = st->pipe;
    struct pipe_image_view image;
 
-   st_convert_image(st, imgObj, &image);
+   st_convert_image(st, imgObj, &image, GL_READ_WRITE);
 
    return pipe->create_image_handle(pipe, &image);
 }
index 9655eede5fed039ea39c19bfa9deff95ae134ec1..56d01d39bf042b9e2163ec1209836e4399b670b3 100644 (file)
@@ -540,7 +540,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);
+   st_convert_image_from_unit(st, &img, imgUnit, GL_READ_WRITE);
 
    return pipe->create_image_handle(pipe, &img);
 }
index 726ab78dad4055dbcbdb5ded390dca4e3611d81f..7fb3f09a1c2e8d7b487a968ef2ddba3b42b1951c 100644 (file)
@@ -320,12 +320,13 @@ st_compressed_format_fallback(struct st_context *st, mesa_format format);
 
 void
 st_convert_image(const struct st_context *st, const struct gl_image_unit *u,
-                 struct pipe_image_view *img);
+                 struct pipe_image_view *img, unsigned shader_access);
 
 void
 st_convert_image_from_unit(const struct st_context *st,
                            struct pipe_image_view *img,
-                           GLuint imgUnit);
+                           GLuint imgUnit,
+                           unsigned shader_access);
 
 void
 st_convert_sampler(const struct st_context *st,