aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers
diff options
context:
space:
mode:
authorJames Xiong <[email protected]>2020-01-16 10:19:34 -0800
committerMarge Bot <[email protected]>2020-01-22 21:18:49 +0000
commitac0219cc5b6afa6d0392a164b58e21ce95079930 (patch)
treefdbf60f9e0eedaaaf90f4f2afb6e71b43e974384 /src/gallium/state_trackers
parent5f78524d9b5c579d492470ebd635178339a551a6 (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.c15
-rw-r--r--src/gallium/state_trackers/dri/dri_helpers.c18
-rw-r--r--src/gallium/state_trackers/dri/dri_helpers.h3
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);