184 lines
7.7 KiB
Diff
184 lines
7.7 KiB
Diff
From 85762f3538a21a99bf1b71d87345ebe51f9de453 Mon Sep 17 00:00:00 2001
|
|
From: Luigi Santivetti <luigi.santivetti@imgtec.com>
|
|
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
|
|
|