Re: [Mesa-dev] [PATCH v3 1/2] st/mesa: add st_convert_image()
For the series: Reviewed-by: Marek OlšákMarek On Fri, Mar 31, 2017 at 12:48 PM, Samuel Pitoiset wrote: > Should be used by the state tracker when glGetImageHandleARB() > is called in order to create a pipe_image_view template. > > v3: - move the comment to *.c > v2: - make 'st' const > - describe the function > > Signed-off-by: Samuel Pitoiset > --- > src/mesa/state_tracker/st_atom_image.c | 106 > ++--- > src/mesa/state_tracker/st_texture.h| 4 ++ > 2 files changed, 63 insertions(+), 47 deletions(-) > > diff --git a/src/mesa/state_tracker/st_atom_image.c > b/src/mesa/state_tracker/st_atom_image.c > index 5dd2cd64f9..6295e8d2cd 100644 > --- a/src/mesa/state_tracker/st_atom_image.c > +++ b/src/mesa/state_tracker/st_atom_image.c > @@ -44,6 +44,64 @@ > #include "st_program.h" > #include "st_format.h" > > +/** > + * Convert a gl_image_unit object to a pipe_image_view object. > + */ > +void > +st_convert_image(const struct st_context *st, const struct gl_image_unit *u, > + struct pipe_image_view *img) > +{ > + struct st_texture_object *stObj = st_texture_object(u->TexObj); > + > + img->resource = stObj->pt; > + img->format = st_mesa_format_to_pipe_format(st, u->_ActualFormat); > + > + switch (u->Access) { > + case GL_READ_ONLY: > + img->access = PIPE_IMAGE_ACCESS_READ; > + break; > + case GL_WRITE_ONLY: > + img->access = PIPE_IMAGE_ACCESS_WRITE; > + break; > + case GL_READ_WRITE: > + img->access = PIPE_IMAGE_ACCESS_READ_WRITE; > + break; > + default: > + unreachable("bad gl_image_unit::Access"); > + } > + > + if (stObj->pt->target == PIPE_BUFFER) { > + unsigned base, size; > + > + base = stObj->base.BufferOffset; > + assert(base < stObj->pt->width0); > + size = MIN2(stObj->pt->width0 - base, > (unsigned)stObj->base.BufferSize); > + > + img->u.buf.offset = base; > + img->u.buf.size = size; > + } else { > + img->u.tex.level = u->Level + stObj->base.MinLevel; > + if (stObj->pt->target == PIPE_TEXTURE_3D) { > + if (u->Layered) { > +img->u.tex.first_layer = 0; > +img->u.tex.last_layer = u_minify(stObj->pt->depth0, > img->u.tex.level) - 1; > + } else { > +img->u.tex.first_layer = u->_Layer; > +img->u.tex.last_layer = u->_Layer; > + } > + } else { > + img->u.tex.first_layer = u->_Layer + stObj->base.MinLayer; > + img->u.tex.last_layer = u->_Layer + stObj->base.MinLayer; > + if (u->Layered && img->resource->array_size > 1) { > +if (stObj->base.Immutable) > + img->u.tex.last_layer += stObj->base.NumLayers - 1; > +else > + img->u.tex.last_layer += img->resource->array_size - 1; > + } > + } > + } > +} > + > static void > st_bind_images(struct st_context *st, struct gl_program *prog, > enum pipe_shader_type shader_type) > @@ -70,53 +128,7 @@ st_bind_images(struct st_context *st, struct gl_program > *prog, > continue; >} > > - img->resource = stObj->pt; > - img->format = st_mesa_format_to_pipe_format(st, u->_ActualFormat); > - > - switch (u->Access) { > - case GL_READ_ONLY: > - img->access = PIPE_IMAGE_ACCESS_READ; > - break; > - case GL_WRITE_ONLY: > - img->access = PIPE_IMAGE_ACCESS_WRITE; > - break; > - case GL_READ_WRITE: > - img->access = PIPE_IMAGE_ACCESS_READ_WRITE; > - break; > - default: > - unreachable("bad gl_image_unit::Access"); > - } > - > - if (stObj->pt->target == PIPE_BUFFER) { > - unsigned base, size; > - > - base = stObj->base.BufferOffset; > - assert(base < stObj->pt->width0); > - size = MIN2(stObj->pt->width0 - base, > (unsigned)stObj->base.BufferSize); > - > - img->u.buf.offset = base; > - img->u.buf.size = size; > - } else { > - img->u.tex.level = u->Level + stObj->base.MinLevel; > - if (stObj->pt->target == PIPE_TEXTURE_3D) { > -if (u->Layered) { > - img->u.tex.first_layer = 0; > - img->u.tex.last_layer = u_minify(stObj->pt->depth0, > img->u.tex.level) - 1; > -} else { > - img->u.tex.first_layer = u->_Layer; > - img->u.tex.last_layer = u->_Layer; > -} > - } else { > -img->u.tex.first_layer = u->_Layer + stObj->base.MinLayer; > -img->u.tex.last_layer = u->_Layer + stObj->base.MinLayer; > -if (u->Layered && img->resource->array_size > 1) { > - if (stObj->base.Immutable) > - img->u.tex.last_layer += stObj->base.NumLayers - 1; > - else > - img->u.tex.last_layer += img->resource->array_size - 1; > -
Re: [Mesa-dev] [PATCH v3 1/2] st/mesa: add st_convert_image()
On 31.03.2017 12:48, Samuel Pitoiset wrote: Should be used by the state tracker when glGetImageHandleARB() is called in order to create a pipe_image_view template. v3: - move the comment to *.c v2: - make 'st' const - describe the function Signed-off-by: Samuel PitoisetReviewed-by: Nicolai Hähnle --- src/mesa/state_tracker/st_atom_image.c | 106 ++--- src/mesa/state_tracker/st_texture.h| 4 ++ 2 files changed, 63 insertions(+), 47 deletions(-) diff --git a/src/mesa/state_tracker/st_atom_image.c b/src/mesa/state_tracker/st_atom_image.c index 5dd2cd64f9..6295e8d2cd 100644 --- a/src/mesa/state_tracker/st_atom_image.c +++ b/src/mesa/state_tracker/st_atom_image.c @@ -44,6 +44,64 @@ #include "st_program.h" #include "st_format.h" +/** + * Convert a gl_image_unit object to a pipe_image_view object. + */ +void +st_convert_image(const struct st_context *st, const struct gl_image_unit *u, + struct pipe_image_view *img) +{ + struct st_texture_object *stObj = st_texture_object(u->TexObj); + + img->resource = stObj->pt; + img->format = st_mesa_format_to_pipe_format(st, u->_ActualFormat); + + switch (u->Access) { + case GL_READ_ONLY: + img->access = PIPE_IMAGE_ACCESS_READ; + break; + case GL_WRITE_ONLY: + img->access = PIPE_IMAGE_ACCESS_WRITE; + break; + case GL_READ_WRITE: + img->access = PIPE_IMAGE_ACCESS_READ_WRITE; + break; + default: + unreachable("bad gl_image_unit::Access"); + } + + if (stObj->pt->target == PIPE_BUFFER) { + unsigned base, size; + + base = stObj->base.BufferOffset; + assert(base < stObj->pt->width0); + size = MIN2(stObj->pt->width0 - base, (unsigned)stObj->base.BufferSize); + + img->u.buf.offset = base; + img->u.buf.size = size; + } else { + img->u.tex.level = u->Level + stObj->base.MinLevel; + if (stObj->pt->target == PIPE_TEXTURE_3D) { + if (u->Layered) { +img->u.tex.first_layer = 0; +img->u.tex.last_layer = u_minify(stObj->pt->depth0, img->u.tex.level) - 1; + } else { +img->u.tex.first_layer = u->_Layer; +img->u.tex.last_layer = u->_Layer; + } + } else { + img->u.tex.first_layer = u->_Layer + stObj->base.MinLayer; + img->u.tex.last_layer = u->_Layer + stObj->base.MinLayer; + if (u->Layered && img->resource->array_size > 1) { +if (stObj->base.Immutable) + img->u.tex.last_layer += stObj->base.NumLayers - 1; +else + img->u.tex.last_layer += img->resource->array_size - 1; + } + } + } +} + static void st_bind_images(struct st_context *st, struct gl_program *prog, enum pipe_shader_type shader_type) @@ -70,53 +128,7 @@ st_bind_images(struct st_context *st, struct gl_program *prog, continue; } - img->resource = stObj->pt; - img->format = st_mesa_format_to_pipe_format(st, u->_ActualFormat); - - switch (u->Access) { - case GL_READ_ONLY: - img->access = PIPE_IMAGE_ACCESS_READ; - break; - case GL_WRITE_ONLY: - img->access = PIPE_IMAGE_ACCESS_WRITE; - break; - case GL_READ_WRITE: - img->access = PIPE_IMAGE_ACCESS_READ_WRITE; - break; - default: - unreachable("bad gl_image_unit::Access"); - } - - if (stObj->pt->target == PIPE_BUFFER) { - unsigned base, size; - - base = stObj->base.BufferOffset; - assert(base < stObj->pt->width0); - size = MIN2(stObj->pt->width0 - base, (unsigned)stObj->base.BufferSize); - - img->u.buf.offset = base; - img->u.buf.size = size; - } else { - img->u.tex.level = u->Level + stObj->base.MinLevel; - if (stObj->pt->target == PIPE_TEXTURE_3D) { -if (u->Layered) { - img->u.tex.first_layer = 0; - img->u.tex.last_layer = u_minify(stObj->pt->depth0, img->u.tex.level) - 1; -} else { - img->u.tex.first_layer = u->_Layer; - img->u.tex.last_layer = u->_Layer; -} - } else { -img->u.tex.first_layer = u->_Layer + stObj->base.MinLayer; -img->u.tex.last_layer = u->_Layer + stObj->base.MinLayer; -if (u->Layered && img->resource->array_size > 1) { - if (stObj->base.Immutable) - img->u.tex.last_layer += stObj->base.NumLayers - 1; - else - img->u.tex.last_layer += img->resource->array_size - 1; -} - } - } + st_convert_image(st, u, img); } cso_set_shader_images(st->cso_context, shader_type, 0, prog->info.num_images, images); diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h index 0ce7989562..00c30f06cf 100644 ---
[Mesa-dev] [PATCH v3 1/2] st/mesa: add st_convert_image()
Should be used by the state tracker when glGetImageHandleARB() is called in order to create a pipe_image_view template. v3: - move the comment to *.c v2: - make 'st' const - describe the function Signed-off-by: Samuel Pitoiset--- src/mesa/state_tracker/st_atom_image.c | 106 ++--- src/mesa/state_tracker/st_texture.h| 4 ++ 2 files changed, 63 insertions(+), 47 deletions(-) diff --git a/src/mesa/state_tracker/st_atom_image.c b/src/mesa/state_tracker/st_atom_image.c index 5dd2cd64f9..6295e8d2cd 100644 --- a/src/mesa/state_tracker/st_atom_image.c +++ b/src/mesa/state_tracker/st_atom_image.c @@ -44,6 +44,64 @@ #include "st_program.h" #include "st_format.h" +/** + * Convert a gl_image_unit object to a pipe_image_view object. + */ +void +st_convert_image(const struct st_context *st, const struct gl_image_unit *u, + struct pipe_image_view *img) +{ + struct st_texture_object *stObj = st_texture_object(u->TexObj); + + img->resource = stObj->pt; + img->format = st_mesa_format_to_pipe_format(st, u->_ActualFormat); + + switch (u->Access) { + case GL_READ_ONLY: + img->access = PIPE_IMAGE_ACCESS_READ; + break; + case GL_WRITE_ONLY: + img->access = PIPE_IMAGE_ACCESS_WRITE; + break; + case GL_READ_WRITE: + img->access = PIPE_IMAGE_ACCESS_READ_WRITE; + break; + default: + unreachable("bad gl_image_unit::Access"); + } + + if (stObj->pt->target == PIPE_BUFFER) { + unsigned base, size; + + base = stObj->base.BufferOffset; + assert(base < stObj->pt->width0); + size = MIN2(stObj->pt->width0 - base, (unsigned)stObj->base.BufferSize); + + img->u.buf.offset = base; + img->u.buf.size = size; + } else { + img->u.tex.level = u->Level + stObj->base.MinLevel; + if (stObj->pt->target == PIPE_TEXTURE_3D) { + if (u->Layered) { +img->u.tex.first_layer = 0; +img->u.tex.last_layer = u_minify(stObj->pt->depth0, img->u.tex.level) - 1; + } else { +img->u.tex.first_layer = u->_Layer; +img->u.tex.last_layer = u->_Layer; + } + } else { + img->u.tex.first_layer = u->_Layer + stObj->base.MinLayer; + img->u.tex.last_layer = u->_Layer + stObj->base.MinLayer; + if (u->Layered && img->resource->array_size > 1) { +if (stObj->base.Immutable) + img->u.tex.last_layer += stObj->base.NumLayers - 1; +else + img->u.tex.last_layer += img->resource->array_size - 1; + } + } + } +} + static void st_bind_images(struct st_context *st, struct gl_program *prog, enum pipe_shader_type shader_type) @@ -70,53 +128,7 @@ st_bind_images(struct st_context *st, struct gl_program *prog, continue; } - img->resource = stObj->pt; - img->format = st_mesa_format_to_pipe_format(st, u->_ActualFormat); - - switch (u->Access) { - case GL_READ_ONLY: - img->access = PIPE_IMAGE_ACCESS_READ; - break; - case GL_WRITE_ONLY: - img->access = PIPE_IMAGE_ACCESS_WRITE; - break; - case GL_READ_WRITE: - img->access = PIPE_IMAGE_ACCESS_READ_WRITE; - break; - default: - unreachable("bad gl_image_unit::Access"); - } - - if (stObj->pt->target == PIPE_BUFFER) { - unsigned base, size; - - base = stObj->base.BufferOffset; - assert(base < stObj->pt->width0); - size = MIN2(stObj->pt->width0 - base, (unsigned)stObj->base.BufferSize); - - img->u.buf.offset = base; - img->u.buf.size = size; - } else { - img->u.tex.level = u->Level + stObj->base.MinLevel; - if (stObj->pt->target == PIPE_TEXTURE_3D) { -if (u->Layered) { - img->u.tex.first_layer = 0; - img->u.tex.last_layer = u_minify(stObj->pt->depth0, img->u.tex.level) - 1; -} else { - img->u.tex.first_layer = u->_Layer; - img->u.tex.last_layer = u->_Layer; -} - } else { -img->u.tex.first_layer = u->_Layer + stObj->base.MinLayer; -img->u.tex.last_layer = u->_Layer + stObj->base.MinLayer; -if (u->Layered && img->resource->array_size > 1) { - if (stObj->base.Immutable) - img->u.tex.last_layer += stObj->base.NumLayers - 1; - else - img->u.tex.last_layer += img->resource->array_size - 1; -} - } - } + st_convert_image(st, u, img); } cso_set_shader_images(st->cso_context, shader_type, 0, prog->info.num_images, images); diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h index 0ce7989562..00c30f06cf 100644 --- a/src/mesa/state_tracker/st_texture.h +++ b/src/mesa/state_tracker/st_texture.h @@ -254,4 +254,8 @@