From 3eb33ec9e9b6832dc2024a196694f3cb38a54278 Mon Sep 17 00:00:00 2001 From: EmperorPenguin18 <60635017+EmperorPenguin18@users.noreply.github.com> Date: Sun, 15 Jan 2023 20:48:03 -0500 Subject: [PATCH] v3d: expose more drm formats with SAND128 modifier Adds four more PIPE_FORMATs that expose BROADCOM_SAND128. This allows mpv to do hardware decoding on the Raspberry Pi 4. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/7944 Reviewed-by: Jose Maria Casanova Crespo Part-of: --- src/gallium/drivers/v3d/v3d_screen.c | 35 ++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c index 0751465adaa..afca50b17cd 100644 --- a/src/gallium/drivers/v3d/v3d_screen.c +++ b/src/gallium/drivers/v3d/v3d_screen.c @@ -777,6 +777,20 @@ v3d_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen, case PIPE_FORMAT_NV12: /* Expose UIF, LINEAR and SAND128 */ break; + + case PIPE_FORMAT_R8_UNORM: + case PIPE_FORMAT_R8G8_UNORM: + case PIPE_FORMAT_R16_UNORM: + case PIPE_FORMAT_R16G16_UNORM: + /* Expose UIF, LINEAR and SAND128 */ + if (!modifiers) break; + *count = MIN2(max, num_modifiers); + for (i = 0; i < *count; i++) { + modifiers[i] = v3d_available_modifiers[i]; + if (external_only) + external_only[i] = modifiers[i] == DRM_FORMAT_MOD_BROADCOM_SAND128; + } + return; default: /* Expose UIF and LINEAR, but not SAND128 */ @@ -803,13 +817,20 @@ v3d_screen_is_dmabuf_modifier_supported(struct pipe_screen *pscreen, bool *external_only) { int i; - bool is_sand_col128 = (format == PIPE_FORMAT_NV12 || format == PIPE_FORMAT_P030) && - (fourcc_mod_broadcom_mod(modifier) == DRM_FORMAT_MOD_BROADCOM_SAND128); - - if (is_sand_col128) { - if (external_only) - *external_only = true; - return true; + if (fourcc_mod_broadcom_mod(modifier) == DRM_FORMAT_MOD_BROADCOM_SAND128) { + switch(format) { + case PIPE_FORMAT_NV12: + case PIPE_FORMAT_P030: + case PIPE_FORMAT_R8_UNORM: + case PIPE_FORMAT_R8G8_UNORM: + case PIPE_FORMAT_R16_UNORM: + case PIPE_FORMAT_R16G16_UNORM: + if (external_only) + *external_only = true; + return true; + default: + return false; + } } else if (format == PIPE_FORMAT_P030) { /* For PIPE_FORMAT_P030 we don't expose LINEAR or UIF. */ return false;