*/
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);
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);
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];
return;
}
- st_convert_image(st, u, img);
+ st_convert_image(st, u, img, shader_access);
}
static void
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);
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);
}
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);
}
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,