diff options
author | Fritz Koenig <[email protected]> | 2018-11-01 17:08:39 -0700 |
---|---|---|
committer | Rob Clark <[email protected]> | 2019-01-22 16:33:27 -0500 |
commit | 7c4b9510d1dac14336f208118559a377b9acc464 (patch) | |
tree | 0abb22fae45fce02845d8cba6bcc7996e0d8c2bd | |
parent | ddbe6171e6a9e5c12a3a55cd45c1b035ab26abba (diff) |
freedreno: add query for dmabuf modifiers
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_screen.c | 43 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_screen.h | 3 |
2 files changed, 46 insertions, 0 deletions
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 <drm_fourcc.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> @@ -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 * |