From 85762f3538a21a99bf1b71d87345ebe51f9de453 Mon Sep 17 00:00:00 2001 From: Luigi Santivetti Date: Thu, 12 Aug 2021 00:55:46 +0100 Subject: [PATCH 64/67] mesa/main: dri: add YUV420_3PLANE and YVU420_3PLANE --- include/GL/internal/dri_interface.h | 2 ++ src/gallium/include/pipe/p_format.h | 3 +++ src/mesa/drivers/dri/common/utils.c | 18 ++++++++++++++++++ src/mesa/drivers/dri/pvr/dri_support.h | 2 ++ src/mesa/drivers/dri/pvr/pvrutil.c | 13 +++++++++++++ src/mesa/main/format_info.py | 2 +- src/mesa/main/formats.c | 2 ++ src/mesa/main/formats.csv | 2 ++ src/mesa/main/formats.h | 6 ++++++ 9 files changed, 49 insertions(+), 1 deletion(-) diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h index 080d191b0a3..7d9a1bd9ba6 100644 --- a/include/GL/internal/dri_interface.h +++ b/include/GL/internal/dri_interface.h @@ -1424,6 +1424,8 @@ struct __DRIdri2ExtensionRec { #define __DRI_IMAGE_FORMAT_BGR888 0x101a #define __DRI_IMAGE_FORMAT_NV12 0x101b #define __DRI_IMAGE_FORMAT_NV21 0x101c +#define __DRI_IMAGE_FORMAT_YU12 0x101d +#define __DRI_IMAGE_FORMAT_YV12 0x101e #define __DRI_IMAGE_USE_SHARE 0x0001 #define __DRI_IMAGE_USE_SCANOUT 0x0002 diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h index fd653379b7a..970f07598d5 100644 --- a/src/gallium/include/pipe/p_format.h +++ b/src/gallium/include/pipe/p_format.h @@ -516,6 +516,9 @@ enum pipe_format { PIPE_FORMAT_YUV420_2PLANE, PIPE_FORMAT_YVU420_2PLANE, + PIPE_FORMAT_YUV420_3PLANE, + PIPE_FORMAT_YVU420_3PLANE, + PIPE_FORMAT_COUNT }; diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c index d268dc41fbb..df5f8cbfdc0 100644 --- a/src/mesa/drivers/dri/common/utils.c +++ b/src/mesa/drivers/dri/common/utils.c @@ -330,6 +330,24 @@ driCreateConfigs(mesa_format format, yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT; yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT; break; + case MESA_FORMAT_YUV420_3PLANE: + masks = format_table[11].masks; + shifts = format_table[11].shifts; + is_yuv = true; /* FIXME: This should come from formats_info.py */ + yuv_order = __DRI_ATTRIB_YUV_ORDER_YUV_BIT; + yuv_num_planes = 3; + yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT; + yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT; + break; + case MESA_FORMAT_YVU420_3PLANE: + masks = format_table[11].masks; + shifts = format_table[11].shifts; + is_yuv = true; /* FIXME: This should come from formats_info.py */ + yuv_order = __DRI_ATTRIB_YUV_ORDER_YVU_BIT; + yuv_num_planes = 3; + yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT; + yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT; + break; default: fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n", __func__, __LINE__, diff --git a/src/mesa/drivers/dri/pvr/dri_support.h b/src/mesa/drivers/dri/pvr/dri_support.h index ab0b9dd9a23..a4999dc36bf 100644 --- a/src/mesa/drivers/dri/pvr/dri_support.h +++ b/src/mesa/drivers/dri/pvr/dri_support.h @@ -189,6 +189,8 @@ typedef enum #define PVRDRI_MESA_FORMAT_YVU420_2PLANE 8 #define PVRDRI_MESA_FORMAT_B8G8R8A8_SRGB 9 #define PVRDRI_MESA_FORMAT_R8G8B8A8_SRGB 10 +#define PVRDRI_MESA_FORMAT_YUV420_3PLANE 11 +#define PVRDRI_MESA_FORMAT_YVU420_3PLANE 12 /* The blit flags match their DRI counterparts */ #define PVRDRI_BLIT_FLAG_FLUSH 0x0001 diff --git a/src/mesa/drivers/dri/pvr/pvrutil.c b/src/mesa/drivers/dri/pvr/pvrutil.c index d107a5dafad..ee11ac55914 100644 --- a/src/mesa/drivers/dri/pvr/pvrutil.c +++ b/src/mesa/drivers/dri/pvr/pvrutil.c @@ -118,6 +118,10 @@ PVRDRIMesaFormatToMesaFormat(int pvrdri_mesa_format) return MESA_FORMAT_B8G8R8A8_SRGB; case PVRDRI_MESA_FORMAT_R8G8B8A8_SRGB: return MESA_FORMAT_R8G8B8A8_SRGB; + case PVRDRI_MESA_FORMAT_YUV420_3PLANE: + return MESA_FORMAT_YUV420_3PLANE; + case PVRDRI_MESA_FORMAT_YVU420_3PLANE: + return MESA_FORMAT_YVU420_3PLANE; default: __driUtilMessage("%s: Unknown format: %d", __func__, pvrdri_mesa_format); break; @@ -178,6 +182,11 @@ PVRDRIFormatToFourCC(int dri_format) return DRM_FORMAT_NV12; case __DRI_IMAGE_FORMAT_NV21: return DRM_FORMAT_NV21; + case __DRI_IMAGE_FORMAT_YU12: + return DRM_FORMAT_YUV420; + case __DRI_IMAGE_FORMAT_YV12: + return DRM_FORMAT_YVU420; + default: __driUtilMessage("%s: Unknown format: %d", __func__, dri_format); break; @@ -238,6 +247,10 @@ PVRDRIFourCCToDRIFormat(int iFourCC) return __DRI_IMAGE_FORMAT_NV12; case DRM_FORMAT_NV21: return __DRI_IMAGE_FORMAT_NV21; + case DRM_FORMAT_YUV420: + return __DRI_IMAGE_FORMAT_YU12; + case DRM_FORMAT_YVU420: + return __DRI_IMAGE_FORMAT_YV12; default: __driUtilMessage("%s: Unknown format: %d", __func__, iFourCC); break; diff --git a/src/mesa/main/format_info.py b/src/mesa/main/format_info.py index d58403ea85e..bc18db74f17 100644 --- a/src/mesa/main/format_info.py +++ b/src/mesa/main/format_info.py @@ -29,7 +29,7 @@ import sys def get_gl_base_format(fmat): if fmat.name == 'MESA_FORMAT_NONE': return 'GL_NONE' - elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV', 'MESA_FORMAT_YUV420_2PLANE', 'MESA_FORMAT_YVU420_2PLANE']: + elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV', 'MESA_FORMAT_YUV420_2PLANE', 'MESA_FORMAT_YVU420_2PLANE', 'MESA_FORMAT_YUV420_3PLANE', 'MESA_FORMAT_YVU420_3PLANE']: return 'GL_YCBCR_MESA' elif fmat.has_channel('r'): if fmat.has_channel('g'): diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c index f81caeceff4..d7b0d0a07c9 100644 --- a/src/mesa/main/formats.c +++ b/src/mesa/main/formats.c @@ -1455,6 +1455,8 @@ _mesa_format_matches_format_and_type(mesa_format mformat, switch (mformat) { case MESA_FORMAT_YUV420_2PLANE: case MESA_FORMAT_YVU420_2PLANE: + case MESA_FORMAT_YUV420_3PLANE: + case MESA_FORMAT_YVU420_3PLANE: return false; default: diff --git a/src/mesa/main/formats.csv b/src/mesa/main/formats.csv index b2d476577e0..825443b10ce 100644 --- a/src/mesa/main/formats.csv +++ b/src/mesa/main/formats.csv @@ -94,6 +94,8 @@ MESA_FORMAT_YCBCR , other , 1, 1, 1, x16 , , , MESA_FORMAT_YCBCR_REV , other , 1, 1, 1, x16 , , , , xyzw, yuv MESA_FORMAT_YUV420_2PLANE , other , 1, 1, 1, x8 , , , , y___, yuv MESA_FORMAT_YVU420_2PLANE , other , 1, 1, 1, x8 , , , , y___, yuv +MESA_FORMAT_YUV420_3PLANE , other , 1, 1, 1, x8 , , , , y___, yuv +MESA_FORMAT_YVU420_3PLANE , other , 1, 1, 1, x8 , , , , y___, yuv MESA_FORMAT_RG_RB_UNORM8 , other , 2, 1, 1, x16 , , , , xyz1, rgb MESA_FORMAT_GR_BR_UNORM8 , other , 2, 1, 1, x16 , , , , xyz1, rgb diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h index 0e778d64467..1ab03d2be7e 100644 --- a/src/mesa/main/formats.h +++ b/src/mesa/main/formats.h @@ -624,6 +624,12 @@ typedef enum pipe_format mesa_format; #define HAVE_MESA_FORMAT_YVU420_2PLANE #define MESA_FORMAT_YVU420_2PLANE PIPE_FORMAT_YVU420_2PLANE +#define HAVE_MESA_FORMAT_YUV420_3PLANE +#define MESA_FORMAT_YUV420_3PLANE PIPE_FORMAT_YUV420_3PLANE + +#define HAVE_MESA_FORMAT_YVU420_3PLANE +#define MESA_FORMAT_YVU420_3PLANE PIPE_FORMAT_YVU420_3PLANE + #define MESA_FORMAT_COUNT PIPE_FORMAT_COUNT /* Packed to array format adapters */ -- 2.25.1