Re: [Mesa-dev] [PATCH v3 1/2] st/mesa: add st_convert_image()

2017-04-02 Thread Marek Olšák
For the series:

Reviewed-by: Marek Olšák 

Marek

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()

2017-04-01 Thread Nicolai Hähnle

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 Pitoiset 


Reviewed-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()

2017-03-31 Thread Samuel Pitoiset
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 @@