diff options
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_atom_image.c | 27 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_cb_texture.c | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_texture.c | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_texture.h | 5 |
4 files changed, 28 insertions, 8 deletions
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, |