Re: [Mesa-dev] [PATCH v2 3/5] gallium: Implement DRIimageExtension.duplicateImage

2013-03-03 Thread John Kåre Alsaker
On Sun, Mar 3, 2013 at 4:52 PM, Jakob Bornecrantz  wrote:
> Have you tested if this actually works? I would guess it would
> render in the right colorspace but for sampling the state tracker
> might just drop the format on the floor.
It works for sampling, but I'm not sure what the current or desired
behavior for render targets should be.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH v2 3/5] gallium: Implement DRIimageExtension.duplicateImage

2013-03-03 Thread Jakob Bornecrantz
On Sun, Mar 3, 2013 at 7:03 AM, John Kåre Alsaker
 wrote:
> ---
>  src/gallium/include/state_tracker/st_api.h |  1 +
>  src/gallium/state_trackers/dri/common/dri_screen.c |  1 +
>  src/gallium/state_trackers/dri/common/dri_screen.h |  1 +
>  src/gallium/state_trackers/dri/drm/dri2.c  | 39 
> +-
>  src/mesa/state_tracker/st_manager.c|  4 +++
>  5 files changed, 45 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/include/state_tracker/st_api.h 
> b/src/gallium/include/state_tracker/st_api.h
> index 9f3d2a1..1e63ed3 100644
> --- a/src/gallium/include/state_tracker/st_api.h
> +++ b/src/gallium/include/state_tracker/st_api.h
> @@ -203,6 +203,7 @@ struct st_egl_image
>  {
> /* this is owned by the caller */
> struct pipe_resource *texture;
> +   enum pipe_format format;
>
> unsigned level;
> unsigned layer;
> diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c 
> b/src/gallium/state_trackers/dri/common/dri_screen.c
> index a908e28..92abaf9 100644
> --- a/src/gallium/state_trackers/dri/common/dri_screen.c
> +++ b/src/gallium/state_trackers/dri/common/dri_screen.c
> @@ -315,6 +315,7 @@ dri_get_egl_image(struct st_manager *smapi,
>
> stimg->texture = NULL;
> pipe_resource_reference(&stimg->texture, img->texture);
> +   stimg->format = img->format;
> stimg->level = img->level;
> stimg->layer = img->layer;
>
> diff --git a/src/gallium/state_trackers/dri/common/dri_screen.h 
> b/src/gallium/state_trackers/dri/common/dri_screen.h
> index 181b22f..d37c393 100644
> --- a/src/gallium/state_trackers/dri/common/dri_screen.h
> +++ b/src/gallium/state_trackers/dri/common/dri_screen.h
> @@ -84,6 +84,7 @@ dri_screen(__DRIscreen * sPriv)
>
>  struct __DRIimageRec {
> struct pipe_resource *texture;
> +   enum pipe_format format;
> unsigned level;
> unsigned layer;
> uint32_t dri_format;
> diff --git a/src/gallium/state_trackers/dri/drm/dri2.c 
> b/src/gallium/state_trackers/dri/drm/dri2.c
> index f8d311c..54339fe 100644
> --- a/src/gallium/state_trackers/dri/drm/dri2.c
> +++ b/src/gallium/state_trackers/dri/drm/dri2.c
> @@ -658,6 +658,7 @@ dri2_dup_image(__DRIimage *image, void *loaderPrivate)
> pipe_resource_reference(&img->texture, image->texture);
> img->level = image->level;
> img->layer = image->layer;
> +   img->format = image->format;
> /* This should be 0 for sub images, but dup is also used for base images. 
> */
> img->dri_components = image->dri_components;
> img->loader_private = loaderPrivate;
> @@ -749,6 +750,40 @@ dri2_from_planar(__DRIimage *image, int plane, void 
> *loaderPrivate)
> return img;
>  }
>
> +static __DRIimage *
> +dri2_duplicate_image(__DRIscreen *_screen, __DRIimage *image,
> + unsigned int flags, void *loaderPrivate)
> +{
> +   enum pipe_format format;
> +   struct dri_screen *screen = dri_screen(_screen);
> +   __DRIimage *img = NULL;
> +
> +   if((flags & __DRI_IMAGE_FLAG_SRGB_VIEW) && (flags & 
> __DRI_IMAGE_FLAG_LINEAR_VIEW))
> +  return NULL;
> +
> +   if(flags & (__DRI_IMAGE_FLAG_SRGB_VIEW | __DRI_IMAGE_FLAG_LINEAR_VIEW)) {
> +  if(!image->texture)
> + return NULL;
> +
> +  if(flags & __DRI_IMAGE_FLAG_SRGB_VIEW)
> + format = util_format_srgb(image->texture->format);
> +  else
> + format = util_format_linear(image->texture->format);
> +
> +  if(!screen->base.screen->is_format_supported(screen->base.screen, 
> format, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW))
> + return NULL;
> +
> +  img = dri2_dup_image(image, loaderPrivate);
> +
> +  if (img)
> + img->format = format;
> +   } else if (flags == 0) {
> +  img = dri2_dup_image(image, loaderPrivate);
> +   }
> +
> +   return img;
> +}
> +
>  static void
>  dri2_destroy_image(__DRIimage *img)
>  {
> @@ -757,7 +792,7 @@ dri2_destroy_image(__DRIimage *img)
>  }
>
>  static struct __DRIimageExtensionRec dri2ImageExtension = {
> -{ __DRI_IMAGE, 5 },
> +{ __DRI_IMAGE, 7 },
>  dri2_create_image_from_name,
>  dri2_create_image_from_renderbuffer,
>  dri2_destroy_image,
> @@ -767,6 +802,8 @@ static struct __DRIimageExtensionRec dri2ImageExtension = 
> {
>  dri2_validate_usage,
>  dri2_from_names,
>  dri2_from_planar,
> +NULL,
> +dri2_duplicate_image,
>  };
>
>  /*
> diff --git a/src/mesa/state_tracker/st_manager.c 
> b/src/mesa/state_tracker/st_manager.c
> index a3a6771..3659499 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -810,6 +810,10 @@ st_manager_get_egl_image_surface(struct st_context *st, 
> void *eglimg)
>return NULL;
>
> u_surface_default_template(&surf_tmpl, stimg.texture);
> +
> +   if(stimg.format != PIPE_FORMAT_NONE)
> +  surf_tmpl.format = stimg.format;
> +

Have you tested if this actually works? I would guess it would
render in the right colorspace but for sampling the state tracker
might j

[Mesa-dev] [PATCH v2 3/5] gallium: Implement DRIimageExtension.duplicateImage

2013-03-02 Thread John Kåre Alsaker
---
 src/gallium/include/state_tracker/st_api.h |  1 +
 src/gallium/state_trackers/dri/common/dri_screen.c |  1 +
 src/gallium/state_trackers/dri/common/dri_screen.h |  1 +
 src/gallium/state_trackers/dri/drm/dri2.c  | 39 +-
 src/mesa/state_tracker/st_manager.c|  4 +++
 5 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/src/gallium/include/state_tracker/st_api.h 
b/src/gallium/include/state_tracker/st_api.h
index 9f3d2a1..1e63ed3 100644
--- a/src/gallium/include/state_tracker/st_api.h
+++ b/src/gallium/include/state_tracker/st_api.h
@@ -203,6 +203,7 @@ struct st_egl_image
 {
/* this is owned by the caller */
struct pipe_resource *texture;
+   enum pipe_format format;
 
unsigned level;
unsigned layer;
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.c 
b/src/gallium/state_trackers/dri/common/dri_screen.c
index a908e28..92abaf9 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.c
+++ b/src/gallium/state_trackers/dri/common/dri_screen.c
@@ -315,6 +315,7 @@ dri_get_egl_image(struct st_manager *smapi,
 
stimg->texture = NULL;
pipe_resource_reference(&stimg->texture, img->texture);
+   stimg->format = img->format;
stimg->level = img->level;
stimg->layer = img->layer;
 
diff --git a/src/gallium/state_trackers/dri/common/dri_screen.h 
b/src/gallium/state_trackers/dri/common/dri_screen.h
index 181b22f..d37c393 100644
--- a/src/gallium/state_trackers/dri/common/dri_screen.h
+++ b/src/gallium/state_trackers/dri/common/dri_screen.h
@@ -84,6 +84,7 @@ dri_screen(__DRIscreen * sPriv)
 
 struct __DRIimageRec {
struct pipe_resource *texture;
+   enum pipe_format format;
unsigned level;
unsigned layer;
uint32_t dri_format;
diff --git a/src/gallium/state_trackers/dri/drm/dri2.c 
b/src/gallium/state_trackers/dri/drm/dri2.c
index f8d311c..54339fe 100644
--- a/src/gallium/state_trackers/dri/drm/dri2.c
+++ b/src/gallium/state_trackers/dri/drm/dri2.c
@@ -658,6 +658,7 @@ dri2_dup_image(__DRIimage *image, void *loaderPrivate)
pipe_resource_reference(&img->texture, image->texture);
img->level = image->level;
img->layer = image->layer;
+   img->format = image->format;
/* This should be 0 for sub images, but dup is also used for base images. */
img->dri_components = image->dri_components;
img->loader_private = loaderPrivate;
@@ -749,6 +750,40 @@ dri2_from_planar(__DRIimage *image, int plane, void 
*loaderPrivate)
return img;
 }
 
+static __DRIimage *
+dri2_duplicate_image(__DRIscreen *_screen, __DRIimage *image,
+ unsigned int flags, void *loaderPrivate)
+{
+   enum pipe_format format;
+   struct dri_screen *screen = dri_screen(_screen);
+   __DRIimage *img = NULL;
+
+   if((flags & __DRI_IMAGE_FLAG_SRGB_VIEW) && (flags & 
__DRI_IMAGE_FLAG_LINEAR_VIEW))
+  return NULL;
+
+   if(flags & (__DRI_IMAGE_FLAG_SRGB_VIEW | __DRI_IMAGE_FLAG_LINEAR_VIEW)) {
+  if(!image->texture)
+ return NULL;
+
+  if(flags & __DRI_IMAGE_FLAG_SRGB_VIEW)
+ format = util_format_srgb(image->texture->format);
+  else
+ format = util_format_linear(image->texture->format);
+
+  if(!screen->base.screen->is_format_supported(screen->base.screen, 
format, PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW))
+ return NULL;
+
+  img = dri2_dup_image(image, loaderPrivate);
+
+  if (img)
+ img->format = format;
+   } else if (flags == 0) {
+  img = dri2_dup_image(image, loaderPrivate);
+   }
+
+   return img;
+}
+
 static void
 dri2_destroy_image(__DRIimage *img)
 {
@@ -757,7 +792,7 @@ dri2_destroy_image(__DRIimage *img)
 }
 
 static struct __DRIimageExtensionRec dri2ImageExtension = {
-{ __DRI_IMAGE, 5 },
+{ __DRI_IMAGE, 7 },
 dri2_create_image_from_name,
 dri2_create_image_from_renderbuffer,
 dri2_destroy_image,
@@ -767,6 +802,8 @@ static struct __DRIimageExtensionRec dri2ImageExtension = {
 dri2_validate_usage,
 dri2_from_names,
 dri2_from_planar,
+NULL,
+dri2_duplicate_image,
 };
 
 /*
diff --git a/src/mesa/state_tracker/st_manager.c 
b/src/mesa/state_tracker/st_manager.c
index a3a6771..3659499 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -810,6 +810,10 @@ st_manager_get_egl_image_surface(struct st_context *st, 
void *eglimg)
   return NULL;
 
u_surface_default_template(&surf_tmpl, stimg.texture);
+
+   if(stimg.format != PIPE_FORMAT_NONE)
+  surf_tmpl.format = stimg.format;
+
surf_tmpl.u.tex.level = stimg.level;
surf_tmpl.u.tex.first_layer = stimg.layer;
surf_tmpl.u.tex.last_layer = stimg.layer;
-- 
1.8.1.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev