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

Jakob Bornecrantz wallbraker at gmail.com
Sun Mar 3 07:52:32 PST 2013


On Sun, Mar 3, 2013 at 7:03 AM, John Kåre Alsaker
<john.kare.alsaker at gmail.com> 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 just drop the format on the floor.

Cheers, Jakob.


More information about the mesa-dev mailing list