summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2017-06-23 16:22:43 +0200
committerLucas Stach <l.stach@pengutronix.de>2017-07-19 16:26:50 +0200
commitc8a0660ab4d1c223de2bbfc578b3d7a03bf400c7 (patch)
tree594dd48cf27dff47b52b0665d480eb9e9f52d28e
parent58c3ce071c28b2d132cb15e309b3168953d957bd (diff)
etnaviv: advertise supported dmabuf modifiers
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@pengutronix.de> Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com> Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com> Reviewed-by: Daniel Stone <daniels@collabora.com>
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_screen.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.c b/src/gallium/drivers/etnaviv/etnaviv_screen.c
index aa24c856b7..0781fec588 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)
@@ -557,6 +559,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)
{
@@ -852,6 +895,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);