summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/etnaviv
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/etnaviv')
-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 aa24c856b71..0781fec5881 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);