From 7c4b9510d1dac14336f208118559a377b9acc464 Mon Sep 17 00:00:00 2001 From: Fritz Koenig Date: Thu, 1 Nov 2018 17:08:39 -0700 Subject: [PATCH] freedreno: add query for dmabuf modifiers --- .../drivers/freedreno/freedreno_screen.c | 43 +++++++++++++++++++ .../drivers/freedreno/freedreno_screen.h | 3 ++ 2 files changed, 46 insertions(+) diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c index e59922cba47..b372d5c5596 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.c +++ b/src/gallium/drivers/freedreno/freedreno_screen.c @@ -39,6 +39,7 @@ #include "util/os_time.h" +#include #include #include #include @@ -654,6 +655,37 @@ fd_screen_bo_get_handle(struct pipe_screen *pscreen, } } +static void +fd_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen, + enum pipe_format format, + int max, uint64_t *modifiers, + unsigned int *external_only, + int *count) +{ + struct fd_screen *screen = fd_screen(pscreen); + int i, num = 0; + + max = MIN2(max, screen->num_supported_modifiers); + + if (!max) { + max = screen->num_supported_modifiers; + external_only = NULL; + modifiers = NULL; + } + + for (i = 0; i < max; i++) { + if (modifiers) + modifiers[num] = screen->supported_modifiers[i]; + + if (external_only) + external_only[num] = 0; + + num++; + } + + *count = num; +} + struct fd_bo * fd_screen_bo_from_handle(struct pipe_screen *pscreen, struct winsys_handle *whandle) @@ -853,6 +885,17 @@ fd_screen_create(struct fd_device *dev) pscreen->fence_finish = fd_fence_finish; pscreen->fence_get_fd = fd_fence_get_fd; + pscreen->query_dmabuf_modifiers = fd_screen_query_dmabuf_modifiers; + + if (!screen->supported_modifiers) { + static const uint64_t supported_modifiers[] = { + DRM_FORMAT_MOD_LINEAR, + }; + + screen->supported_modifiers = supported_modifiers; + screen->num_supported_modifiers = ARRAY_SIZE(supported_modifiers); + } + slab_create_parent(&screen->transfer_pool, sizeof(struct fd_transfer), 16); return pscreen; diff --git a/src/gallium/drivers/freedreno/freedreno_screen.h b/src/gallium/drivers/freedreno/freedreno_screen.h index fedb8ffc906..243770ffd90 100644 --- a/src/gallium/drivers/freedreno/freedreno_screen.h +++ b/src/gallium/drivers/freedreno/freedreno_screen.h @@ -97,6 +97,9 @@ struct fd_screen { bool reorder; uint16_t rsc_seqno; + + unsigned num_supported_modifiers; + const uint64_t *supported_modifiers; }; static inline struct fd_screen *