2017-07-04 17:46 GMT+02:00 Lucas Stach <l.st...@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.st...@pengutronix.de>
Reviewed-by: Christian Gmeiner <christian.gmei...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev