diff options
author | James Xiong <[email protected]> | 2020-01-16 10:19:34 -0800 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-01-22 21:18:49 +0000 |
commit | ac0219cc5b6afa6d0392a164b58e21ce95079930 (patch) | |
tree | fdbf60f9e0eedaaaf90f4f2afb6e71b43e974384 /src/gallium/state_trackers | |
parent | 5f78524d9b5c579d492470ebd635178339a551a6 (diff) |
gallium: dmabuf support for yuv formats that are not natively supported
V2 (Kenneth Graunke):
added a helper function to check if every format is supported
Signed-off-by: James Xiong <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2846>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2846>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r-- | src/gallium/state_trackers/dri/dri2.c | 15 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_helpers.c | 18 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_helpers.h | 3 |
3 files changed, 26 insertions, 10 deletions
diff --git a/src/gallium/state_trackers/dri/dri2.c b/src/gallium/state_trackers/dri/dri2.c index 82c57b78d99..05ebb4ef1d7 100644 --- a/src/gallium/state_trackers/dri/dri2.c +++ b/src/gallium/state_trackers/dri/dri2.c @@ -755,15 +755,7 @@ dri2_create_image_from_winsys(__DRIscreen *_screen, * add sampler view usage. */ use_lowered = true; - for (i = 0; i < map->nplanes; i++) { - if (!pscreen->is_format_supported(pscreen, - dri2_get_pipe_format_for_dri_format(map->planes[i].dri_format), - screen->target, 0, 0, - PIPE_BIND_SAMPLER_VIEW)) - break; - } - - if (i == map->nplanes) + if (dri2_yuv_dma_buf_supported(screen, map)) tex_usage |= PIPE_BIND_SAMPLER_VIEW; } @@ -1407,6 +1399,11 @@ dri2_query_dma_buf_modifiers(__DRIscreen *_screen, int fourcc, int max, pscreen->query_dmabuf_modifiers(pscreen, format, max, modifiers, external_only, count); return true; + } else if (dri2_yuv_dma_buf_supported(screen, map)) { + *count = 1; + if (modifiers) + modifiers[0] = DRM_FORMAT_MOD_NONE; + return true; } return false; } diff --git a/src/gallium/state_trackers/dri/dri_helpers.c b/src/gallium/state_trackers/dri/dri_helpers.c index d4de8cdc59f..90a8a392fad 100644 --- a/src/gallium/state_trackers/dri/dri_helpers.c +++ b/src/gallium/state_trackers/dri/dri_helpers.c @@ -567,6 +567,21 @@ dri2_get_pipe_format_for_dri_format(int format) } boolean +dri2_yuv_dma_buf_supported(struct dri_screen *screen, + const struct dri2_format_mapping *map) +{ + struct pipe_screen *pscreen = screen->base.screen; + + for (unsigned i = 0; i < map->nplanes; i++) { + if (!pscreen->is_format_supported(pscreen, + dri2_get_pipe_format_for_dri_format(map->planes[i].dri_format), + screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW)) + return false; + } + return true; +} + +boolean dri2_query_dma_buf_formats(__DRIscreen *_screen, int max, int *formats, int *count) { @@ -589,7 +604,8 @@ dri2_query_dma_buf_formats(__DRIscreen *_screen, int max, int *formats, PIPE_BIND_RENDER_TARGET) || pscreen->is_format_supported(pscreen, map->pipe_format, screen->target, 0, 0, - PIPE_BIND_SAMPLER_VIEW)) { + PIPE_BIND_SAMPLER_VIEW) || + dri2_yuv_dma_buf_supported(screen, map)) { if (j < max) formats[j] = map->dri_fourcc; j++; diff --git a/src/gallium/state_trackers/dri/dri_helpers.h b/src/gallium/state_trackers/dri/dri_helpers.h index f0c1bbf1597..0393a48a8ee 100644 --- a/src/gallium/state_trackers/dri/dri_helpers.h +++ b/src/gallium/state_trackers/dri/dri_helpers.h @@ -56,6 +56,9 @@ dri2_get_pipe_format_for_dri_format(int format); boolean dri2_query_dma_buf_formats(__DRIscreen *_screen, int max, int *formats, int *count); +boolean +dri2_yuv_dma_buf_supported(struct dri_screen *screen, + const struct dri2_format_mapping *map); __DRIimage * dri2_lookup_egl_image(struct dri_screen *screen, void *handle); |