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 <james.xiong@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2846>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/2846>
This commit is contained in:
James Xiong 2020-01-16 10:19:34 -08:00 committed by Marge Bot
parent 5f78524d9b
commit ac0219cc5b
3 changed files with 26 additions and 10 deletions

View File

@ -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;
}

View File

@ -566,6 +566,21 @@ dri2_get_pipe_format_for_dri_format(int format)
return PIPE_FORMAT_NONE;
}
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++;

View File

@ -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);