summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/include/pipe/p_state.h3
-rw-r--r--src/mesa/state_tracker/st_atom_image.c27
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c2
-rw-r--r--src/mesa/state_tracker/st_texture.c2
-rw-r--r--src/mesa/state_tracker/st_texture.h5
5 files changed, 30 insertions, 9 deletions
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index 95a18a72b5c..fd670345aad 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -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 {
diff --git a/src/mesa/state_tracker/st_atom_image.c b/src/mesa/state_tracker/st_atom_image.c
index 421c926cf04..db3539259ce 100644
--- a/src/mesa/state_tracker/st_atom_image.c
+++ b/src/mesa/state_tracker/st_atom_image.c
@@ -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);
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index e6e27a852f5..b8cc616d8f2 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -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);
}
diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c
index 9655eede5fe..56d01d39bf0 100644
--- a/src/mesa/state_tracker/st_texture.c
+++ b/src/mesa/state_tracker/st_texture.c
@@ -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);
}
diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h
index 726ab78dad4..7fb3f09a1c2 100644
--- a/src/mesa/state_tracker/st_texture.h
+++ b/src/mesa/state_tracker/st_texture.h
@@ -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,