[Mesa-dev] [PATCH 7/7] i965: Add format/modifier advertising

Jason Ekstrand jason at jlekstrand.net
Thu Jun 8 19:34:36 UTC 2017


On Tue, Jun 6, 2017 at 10:18 AM, Daniel Stone <daniels at collabora.com> wrote:

> From: Varad Gautam <varad.gautam at collabora.com>
>
> v2: Rebase and reuse tiling/modifier map. (Daniel Stone)
> v3: bump DRIimageExtension to version 15, fill external_only array.
>
> Signed-off-by: Varad Gautam <varadgautam at gmail.com>
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
>  src/mesa/drivers/dri/i965/intel_screen.c | 76
> ++++++++++++++++++++++++++++++--
>  1 file changed, 72 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.c
> b/src/mesa/drivers/dri/i965/intel_screen.c
> index e7d2af7852..10835f991a 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.c
> +++ b/src/mesa/drivers/dri/i965/intel_screen.c
> @@ -294,14 +294,15 @@ static struct intel_image_format
> intel_image_formats[] = {
>  static const struct {
>     uint32_t tiling;
>     uint64_t modifier;
> +   unsigned since_gen;
>     unsigned height_align;
>  } tiling_modifier_map[] = {
>     { .tiling = I915_TILING_NONE, .modifier = DRM_FORMAT_MOD_LINEAR,
> -     .height_align = 1 },
> +     .since_gen = 1, .height_align = 1 },
>     { .tiling = I915_TILING_X, .modifier = I915_FORMAT_MOD_X_TILED,
> -     .height_align = 8 },
> +     .since_gen = 1, .height_align = 8 },
>     { .tiling = I915_TILING_Y, .modifier = I915_FORMAT_MOD_Y_TILED,
> -     .height_align = 32 },
> +     .since_gen = 9, .height_align = 32 },
>

This is wrong.  Scanout may only support the Y-tiling modifier on gen9+ but
mesa should support it on at least gen6+.  (We could probably support it
all the way back to gen4 eventually but that's tricky with the number of
blitter paths we have.)  We very badly want Y-tiling for windowed
surfaces.  With since_gen changed to 6 for Y_TILED, the series is

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>


>  };
>
>  static bool
> @@ -1014,6 +1015,71 @@ intel_create_image_from_dma_bufs(__DRIscreen
> *dri_screen,
>                                              loaderPrivate);
>  }
>
> +static GLboolean
> +intel_query_dma_buf_formats(__DRIscreen *screen, int max,
> +                            int *formats, int *count)
> +{
> +   int i, j = 0;
> +
> +   if (max == 0) {
> +      *count = ARRAY_SIZE(intel_image_formats) - 1; /* not SARGB */
> +      return true;
> +   }
> +
> +   for (i = 0; i < (ARRAY_SIZE(intel_image_formats)) && j < max; i++) {
> +     if (intel_image_formats[i].fourcc == __DRI_IMAGE_FOURCC_SARGB8888)
> +       continue;
> +     formats[j++] = intel_image_formats[i].fourcc;
> +   }
> +
> +   *count = j;
> +   return true;
> +}
> +
> +static GLboolean
> +intel_query_dma_buf_modifiers(__DRIscreen *_screen, int fourcc, int max,
> +                              uint64_t *modifiers,
> +                              unsigned int *external_only,
> +                              int *count)
> +{
> +   struct intel_screen *screen = _screen->driverPrivate;
> +   struct intel_image_format *f;
> +   int num_mods = 0, i;
> +
> +   f = intel_image_format_lookup(fourcc);
> +   if (f == NULL)
> +      return false;
> +
> +   for (i = 0; i < ARRAY_SIZE(tiling_modifier_map); i++) {
> +      if (screen->devinfo.gen < tiling_modifier_map[i].since_gen)
> +         continue;
> +
> +      num_mods++;
> +      if (max == 0)
> +         continue;
> +
> +      modifiers[num_mods - 1] = tiling_modifier_map[i].modifier;
> +      if (num_mods >= max)
> +        break;
> +   }
> +
> +   if (external_only != NULL) {
> +      for (i = 0; i < num_mods && i < max; i++) {
> +         if (f->components == __DRI_IMAGE_COMPONENTS_Y_U_V ||
> +             f->components == __DRI_IMAGE_COMPONENTS_Y_UV ||
> +             f->components == __DRI_IMAGE_COMPONENTS_Y_XUXV) {
> +            external_only[i] = GL_TRUE;
> +         }
> +         else {
> +            external_only[i] = GL_FALSE;
> +         }
> +      }
> +   }
> +
> +   *count = num_mods;
> +   return true;
> +}
> +
>  static __DRIimage *
>  intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
>  {
> @@ -1061,7 +1127,7 @@ intel_from_planar(__DRIimage *parent, int plane,
> void *loaderPrivate)
>  }
>
>  static const __DRIimageExtension intelImageExtension = {
> -    .base = { __DRI_IMAGE, 14 },
> +    .base = { __DRI_IMAGE, 15 },
>
>      .createImageFromName                = intel_create_image_from_name,
>      .createImageFromRenderbuffer        = intel_create_image_from_
> renderbuffer,
> @@ -1081,6 +1147,8 @@ static const __DRIimageExtension intelImageExtension
> = {
>      .unmapImage                         = NULL,
>      .createImageWithModifiers           = intel_create_image_with_
> modifiers,
>      .createImageFromDmaBufs2            = intel_create_image_from_dma_
> bufs2,
> +    .queryDmaBufFormats                 = intel_query_dma_buf_formats,
> +    .queryDmaBufModifiers               = intel_query_dma_buf_modifiers,
>  };
>
>  static uint64_t
> --
> 2.13.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170608/8b9d44a7/attachment.html>


More information about the mesa-dev mailing list