[Mesa-dev] [PATCH v13 11/36] st/dri: implement createImageWithModifiers in DRIimage

Lucas Stach l.stach at pengutronix.de
Fri May 19 14:42:40 UTC 2017


Am Freitag, den 19.05.2017, 10:37 +0100 schrieb Daniel Stone:
> From: Varad Gautam <varad.gautam at collabora.com>
> 
> adds a pscreen->resource_create_with_modifiers() to create textures
> with modifier.
> 
> Signed-off-by: Varad Gautam <varad.gautam at collabora.com>
> Signed-off-by: Daniel Stone <daniels at collabora.com>

Reviewed-by: Lucas Stach <l.stach at pengutronix.de>

> ---
>  src/gallium/include/pipe/p_screen.h   | 18 ++++++++
>  src/gallium/state_trackers/dri/dri2.c | 79 ++++++++++++++++++++++++++++-------
>  2 files changed, 81 insertions(+), 16 deletions(-)
> 
> diff --git a/src/gallium/include/pipe/p_screen.h b/src/gallium/include/pipe/p_screen.h
> index 8b4239c61a..8eddf355d7 100644
> --- a/src/gallium/include/pipe/p_screen.h
> +++ b/src/gallium/include/pipe/p_screen.h
> @@ -328,6 +328,24 @@ struct pipe_screen {
>      * driver doesn't support an on-disk shader cache.
>      */
>     struct disk_cache *(*get_disk_shader_cache)(struct pipe_screen *screen);
> +
> +   /**
> +    * Create a new texture object from the given template info, taking
> +    * format modifiers into account. \p modifiers specifies a list of format
> +    * modifier tokens, as defined in drm_fourcc.h. The driver then picks the
> +    * best modifier among these and creates the resource. \p count must
> +    * contain the size of \p modifiers array. The selected modifier is
> +    * returned via \p modifier after a successful call.
> +    *
> +    * Returns NULL if an entry in \p modifiers is unsupported by the driver,
> +    * or if only DRM_FORMAT_MOD_INVALID is provided.
> +    */
> +   struct pipe_resource * (*resource_create_with_modifiers)(
> +                           struct pipe_screen *,
> +                           const struct pipe_resource *templat,
> +                           const uint64_t *modifiers, int count,
> +                           uint64_t *modifier);
> +
>  };
>  
> 
> diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c
> index 7614474e4a..713f482181 100644
> --- a/src/gallium/state_trackers/dri/dri2.c
> +++ b/src/gallium/state_trackers/dri/dri2.c
> @@ -977,27 +977,38 @@ dri2_create_image_from_renderbuffer(__DRIcontext *context,
>  }
>  
>  static __DRIimage *
> -dri2_create_image(__DRIscreen *_screen,
> -                   int width, int height, int format,
> -                   unsigned int use, void *loaderPrivate)
> +dri2_create_image_common(__DRIscreen *_screen,
> +                         int width, int height,
> +                         int format, unsigned int use,
> +                         const uint64_t *modifiers,
> +                         const unsigned count,
> +                         void *loaderPrivate)
>  {
>     struct dri_screen *screen = dri_screen(_screen);
>     __DRIimage *img;
>     struct pipe_resource templ;
>     unsigned tex_usage;
>     enum pipe_format pf;
> +   uint64_t modifier = DRM_FORMAT_MOD_INVALID;
> +
> +   /* createImageWithModifiers doesn't supply usage, and we should not get
> +    * here with both modifiers and a usage flag.
> +    */
> +   assert(!(use && (modifiers != NULL)));
>  
>     tex_usage = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
> -   if (use & __DRI_IMAGE_USE_SCANOUT)
> -      tex_usage |= PIPE_BIND_SCANOUT;
> -   if (use & __DRI_IMAGE_USE_SHARE)
> -      tex_usage |= PIPE_BIND_SHARED;
> -   if (use & __DRI_IMAGE_USE_LINEAR)
> -      tex_usage |= PIPE_BIND_LINEAR;
> -   if (use & __DRI_IMAGE_USE_CURSOR) {
> -      if (width != 64 || height != 64)
> -         return NULL;
> -      tex_usage |= PIPE_BIND_CURSOR;
> +   if (use) {
> +      if (use & __DRI_IMAGE_USE_SCANOUT)
> +         tex_usage |= PIPE_BIND_SCANOUT;
> +      if (use & __DRI_IMAGE_USE_SHARE)
> +         tex_usage |= PIPE_BIND_SHARED;
> +      if (use & __DRI_IMAGE_USE_LINEAR)
> +         tex_usage |= PIPE_BIND_LINEAR;
> +      if (use & __DRI_IMAGE_USE_CURSOR) {
> +         if (width != 64 || height != 64)
> +            return NULL;
> +         tex_usage |= PIPE_BIND_CURSOR;
> +      }
>     }
>  
>     pf = dri2_format_to_pipe_format (format);
> @@ -1018,7 +1029,16 @@ dri2_create_image(__DRIscreen *_screen,
>     templ.depth0 = 1;
>     templ.array_size = 1;
>  
> -   img->texture = screen->base.screen->resource_create(screen->base.screen, &templ);
> +   if (modifiers)
> +      img->texture = screen->base.screen
> +                        ->resource_create_with_modifiers(screen->base.screen,
> +                                                         &templ,
> +                                                         modifiers,
> +                                                         count,
> +                                                         &modifier);
> +   else
> +      img->texture = screen->base.screen
> +                        ->resource_create(screen->base.screen, &templ);
>     if (!img->texture) {
>        FREE(img);
>        return NULL;
> @@ -1029,12 +1049,34 @@ dri2_create_image(__DRIscreen *_screen,
>     img->dri_format = format;
>     img->dri_components = 0;
>     img->use = use;
> -   img->modifier = DRM_FORMAT_MOD_INVALID;
> +   img->modifier = modifier;
>  
>     img->loader_private = loaderPrivate;
>     return img;
>  }
>  
> +static __DRIimage *
> +dri2_create_image(__DRIscreen *_screen,
> +                   int width, int height, int format,
> +                   unsigned int use, void *loaderPrivate)
> +{
> +   return dri2_create_image_common(_screen, width, height, format, use,
> +                                   NULL /* modifiers */, 0 /* count */,
> +                                   loaderPrivate);
> +}
> +
> +static __DRIimage *
> +dri2_create_image_with_modifiers(__DRIscreen *dri_screen,
> +                                 int width, int height, int format,
> +                                 const uint64_t *modifiers,
> +                                 const unsigned count,
> +                                 void *loaderPrivate)
> +{
> +   return dri2_create_image_common(dri_screen, width, height, format,
> +                                   0 /* use */, modifiers, count,
> +                                   loaderPrivate);
> +}
> +
>  static GLboolean
>  dri2_query_image(__DRIimage *image, int attrib, int *value)
>  {
> @@ -1432,7 +1474,7 @@ dri2_get_capabilities(__DRIscreen *_screen)
>  
>  /* The extension is modified during runtime if DRI_PRIME is detected */
>  static __DRIimageExtension dri2ImageExtension = {
> -    .base = { __DRI_IMAGE, 12 },
> +    .base = { __DRI_IMAGE, 14 },
>  
>      .createImageFromName          = dri2_create_image_from_name,
>      .createImageFromRenderbuffer  = dri2_create_image_from_renderbuffer,
> @@ -1450,6 +1492,7 @@ static __DRIimageExtension dri2ImageExtension = {
>      .getCapabilities              = dri2_get_capabilities,
>      .mapImage                     = dri2_map_image,
>      .unmapImage                   = dri2_unmap_image,
> +    .createImageWithModifiers     = NULL,
>  };
>  
> 
> @@ -1998,6 +2041,10 @@ dri2_init_screen(__DRIscreen * sPriv)
>        }
>     }
>  
> +   if (pscreen->resource_create_with_modifiers)
> +      dri2ImageExtension.createImageWithModifiers =
> +         dri2_create_image_with_modifiers;
> +
>     if (pscreen->get_param(pscreen, PIPE_CAP_DEVICE_RESET_STATUS_QUERY)) {
>        sPriv->extensions = dri_robust_screen_extensions;
>        screen->has_reset_status_query = true;




More information about the mesa-dev mailing list