[Mesa-dev] [PATCH v2 10/10] etnaviv: advertise supported dmabuf modifiers

Christian Gmeiner christian.gmeiner at gmail.com
Wed Jul 19 09:07:24 UTC 2017


2017-07-04 17:46 GMT+02:00 Lucas Stach <l.stach at pengutronix.de>:
> Simply advertise all supported modifiers, independent of the format.
> Special formats, like compressed, which don't support all those modifiers
> are already culled from the dmabuf format list, as we don't support
> the render target binding for them.
>
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>

Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>

> ---
> v2: don't advertise split tiled formats on single pipe/buffer GPUs
> ---
>  src/gallium/drivers/etnaviv/etnaviv_screen.c | 44 ++++++++++++++++++++++++++++
>  1 file changed, 44 insertions(+)
>
> diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> index d5210347a521..6868281b2e69 100644
> --- a/src/gallium/drivers/etnaviv/etnaviv_screen.c
> +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.c
> @@ -45,6 +45,8 @@
>
>  #include "state_tracker/drm_driver.h"
>
> +#include <drm_fourcc.h>
> +
>  #define ETNA_DRM_VERSION(major, minor) ((major) << 16 | (minor))
>  #define ETNA_DRM_VERSION_FENCE_FD      ETNA_DRM_VERSION(1, 1)
>
> @@ -560,6 +562,47 @@ etna_screen_is_format_supported(struct pipe_screen *pscreen,
>     return usage == allowed;
>  }
>
> +const uint64_t supported_modifiers[] = {
> +   DRM_FORMAT_MOD_LINEAR,
> +   DRM_FORMAT_MOD_VIVANTE_TILED,
> +   DRM_FORMAT_MOD_VIVANTE_SUPER_TILED,
> +   DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED,
> +   DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED,
> +};
> +
> +static void
> +etna_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen,
> +                                   enum pipe_format format, int max,
> +                                   uint64_t *modifiers,
> +                                   unsigned int *external_only, int *count)
> +{
> +   struct etna_screen *screen = etna_screen(pscreen);
> +   int i, num_modifiers = 0;
> +
> +   if (max > ARRAY_SIZE(supported_modifiers))
> +      max = ARRAY_SIZE(supported_modifiers);
> +
> +   if (!max) {
> +      modifiers = NULL;
> +      max = ARRAY_SIZE(supported_modifiers);
> +   }
> +
> +   for (i = 0; num_modifiers < max; i++) {
> +      /* don't advertise split tiled formats on single pipe/buffer GPUs */
> +      if ((screen->specs.pixel_pipes == 1 || screen->specs.single_buffer) &&
> +          i >= 3)
> +         break;
> +
> +      if (modifiers)
> +         modifiers[num_modifiers] = supported_modifiers[i];
> +      if (external_only)
> +         external_only[num_modifiers] = 0;
> +      num_modifiers++;
> +   }
> +
> +   *count = num_modifiers;
> +}
> +
>  static boolean
>  etna_get_specs(struct etna_screen *screen)
>  {
> @@ -854,6 +897,7 @@ etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
>     pscreen->get_timestamp = etna_screen_get_timestamp;
>     pscreen->context_create = etna_context_create;
>     pscreen->is_format_supported = etna_screen_is_format_supported;
> +   pscreen->query_dmabuf_modifiers = etna_screen_query_dmabuf_modifiers;
>
>     etna_fence_screen_init(pscreen);
>     etna_query_screen_init(pscreen);
> --
> 2.11.0
>

greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info


More information about the mesa-dev mailing list