0064-mesa-main-dri-add-YUV420_3PLANE-and-YVU420_3PLANE.patch 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. From fa99f7580504ea68bf36cf1f0dcf7cdcd0338916 Mon Sep 17 00:00:00 2001
  2. From: Luigi Santivetti <luigi.santivetti@imgtec.com>
  3. Date: Thu, 12 Aug 2021 00:55:46 +0100
  4. Subject: [PATCH] mesa/main: dri: add YUV420_3PLANE and YVU420_3PLANE
  5. ---
  6. include/GL/internal/dri_interface.h | 2 ++
  7. src/gallium/include/pipe/p_format.h | 3 +++
  8. src/mesa/drivers/dri/common/utils.c | 18 ++++++++++++++++++
  9. src/mesa/drivers/dri/pvr/dri_support.h | 2 ++
  10. src/mesa/drivers/dri/pvr/pvrutil.c | 13 +++++++++++++
  11. src/mesa/main/format_info.py | 2 +-
  12. src/mesa/main/formats.c | 2 ++
  13. src/mesa/main/formats.csv | 2 ++
  14. src/mesa/main/formats.h | 6 ++++++
  15. 9 files changed, 49 insertions(+), 1 deletion(-)
  16. diff --git a/include/GL/internal/dri_interface.h b/include/GL/internal/dri_interface.h
  17. index 080d191..7d9a1bd 100644
  18. --- a/include/GL/internal/dri_interface.h
  19. +++ b/include/GL/internal/dri_interface.h
  20. @@ -1424,6 +1424,8 @@ struct __DRIdri2ExtensionRec {
  21. #define __DRI_IMAGE_FORMAT_BGR888 0x101a
  22. #define __DRI_IMAGE_FORMAT_NV12 0x101b
  23. #define __DRI_IMAGE_FORMAT_NV21 0x101c
  24. +#define __DRI_IMAGE_FORMAT_YU12 0x101d
  25. +#define __DRI_IMAGE_FORMAT_YV12 0x101e
  26. #define __DRI_IMAGE_USE_SHARE 0x0001
  27. #define __DRI_IMAGE_USE_SCANOUT 0x0002
  28. diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h
  29. index fd65337..970f075 100644
  30. --- a/src/gallium/include/pipe/p_format.h
  31. +++ b/src/gallium/include/pipe/p_format.h
  32. @@ -516,6 +516,9 @@ enum pipe_format {
  33. PIPE_FORMAT_YUV420_2PLANE,
  34. PIPE_FORMAT_YVU420_2PLANE,
  35. + PIPE_FORMAT_YUV420_3PLANE,
  36. + PIPE_FORMAT_YVU420_3PLANE,
  37. +
  38. PIPE_FORMAT_COUNT
  39. };
  40. diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c
  41. index d268dc4..df5f8cb 100644
  42. --- a/src/mesa/drivers/dri/common/utils.c
  43. +++ b/src/mesa/drivers/dri/common/utils.c
  44. @@ -330,6 +330,24 @@ driCreateConfigs(mesa_format format,
  45. yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
  46. yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
  47. break;
  48. + case MESA_FORMAT_YUV420_3PLANE:
  49. + masks = format_table[11].masks;
  50. + shifts = format_table[11].shifts;
  51. + is_yuv = true; /* FIXME: This should come from formats_info.py */
  52. + yuv_order = __DRI_ATTRIB_YUV_ORDER_YUV_BIT;
  53. + yuv_num_planes = 3;
  54. + yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
  55. + yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
  56. + break;
  57. + case MESA_FORMAT_YVU420_3PLANE:
  58. + masks = format_table[11].masks;
  59. + shifts = format_table[11].shifts;
  60. + is_yuv = true; /* FIXME: This should come from formats_info.py */
  61. + yuv_order = __DRI_ATTRIB_YUV_ORDER_YVU_BIT;
  62. + yuv_num_planes = 3;
  63. + yuv_subsample = __DRI_ATTRIB_YUV_SUBSAMPLE_4_2_0_BIT;
  64. + yuv_plane_bpp = __DRI_ATTRIB_YUV_PLANE_BPP_8_BIT;
  65. + break;
  66. default:
  67. fprintf(stderr, "[%s:%u] Unknown framebuffer type %s (%d).\n",
  68. __func__, __LINE__,
  69. diff --git a/src/mesa/drivers/dri/pvr/dri_support.h b/src/mesa/drivers/dri/pvr/dri_support.h
  70. index 6314104..51524a9 100644
  71. --- a/src/mesa/drivers/dri/pvr/dri_support.h
  72. +++ b/src/mesa/drivers/dri/pvr/dri_support.h
  73. @@ -92,6 +92,8 @@ typedef enum
  74. #define PVRDRI_MESA_FORMAT_YVU420_2PLANE 8
  75. #define PVRDRI_MESA_FORMAT_B8G8R8A8_SRGB 9
  76. #define PVRDRI_MESA_FORMAT_R8G8B8A8_SRGB 10
  77. +#define PVRDRI_MESA_FORMAT_YUV420_3PLANE 11
  78. +#define PVRDRI_MESA_FORMAT_YVU420_3PLANE 12
  79. typedef struct __DRIimageRec __DRIimage;
  80. diff --git a/src/mesa/drivers/dri/pvr/pvrutil.c b/src/mesa/drivers/dri/pvr/pvrutil.c
  81. index d107a5d..ee11ac5 100644
  82. --- a/src/mesa/drivers/dri/pvr/pvrutil.c
  83. +++ b/src/mesa/drivers/dri/pvr/pvrutil.c
  84. @@ -118,6 +118,10 @@ PVRDRIMesaFormatToMesaFormat(int pvrdri_mesa_format)
  85. return MESA_FORMAT_B8G8R8A8_SRGB;
  86. case PVRDRI_MESA_FORMAT_R8G8B8A8_SRGB:
  87. return MESA_FORMAT_R8G8B8A8_SRGB;
  88. + case PVRDRI_MESA_FORMAT_YUV420_3PLANE:
  89. + return MESA_FORMAT_YUV420_3PLANE;
  90. + case PVRDRI_MESA_FORMAT_YVU420_3PLANE:
  91. + return MESA_FORMAT_YVU420_3PLANE;
  92. default:
  93. __driUtilMessage("%s: Unknown format: %d", __func__, pvrdri_mesa_format);
  94. break;
  95. @@ -178,6 +182,11 @@ PVRDRIFormatToFourCC(int dri_format)
  96. return DRM_FORMAT_NV12;
  97. case __DRI_IMAGE_FORMAT_NV21:
  98. return DRM_FORMAT_NV21;
  99. + case __DRI_IMAGE_FORMAT_YU12:
  100. + return DRM_FORMAT_YUV420;
  101. + case __DRI_IMAGE_FORMAT_YV12:
  102. + return DRM_FORMAT_YVU420;
  103. +
  104. default:
  105. __driUtilMessage("%s: Unknown format: %d", __func__, dri_format);
  106. break;
  107. @@ -238,6 +247,10 @@ PVRDRIFourCCToDRIFormat(int iFourCC)
  108. return __DRI_IMAGE_FORMAT_NV12;
  109. case DRM_FORMAT_NV21:
  110. return __DRI_IMAGE_FORMAT_NV21;
  111. + case DRM_FORMAT_YUV420:
  112. + return __DRI_IMAGE_FORMAT_YU12;
  113. + case DRM_FORMAT_YVU420:
  114. + return __DRI_IMAGE_FORMAT_YV12;
  115. default:
  116. __driUtilMessage("%s: Unknown format: %d", __func__, iFourCC);
  117. break;
  118. diff --git a/src/mesa/main/format_info.py b/src/mesa/main/format_info.py
  119. index d58403e..bc18db7 100644
  120. --- a/src/mesa/main/format_info.py
  121. +++ b/src/mesa/main/format_info.py
  122. @@ -29,7 +29,7 @@ import sys
  123. def get_gl_base_format(fmat):
  124. if fmat.name == 'MESA_FORMAT_NONE':
  125. return 'GL_NONE'
  126. - elif fmat.name in ['MESA_FORMAT_YCBCR', 'MESA_FORMAT_YCBCR_REV', 'MESA_FORMAT_YUV420_2PLANE', 'MESA_FORMAT_YVU420_2PLANE']:
  127. + 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']:
  128. return 'GL_YCBCR_MESA'
  129. elif fmat.has_channel('r'):
  130. if fmat.has_channel('g'):
  131. diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
  132. index f81caec..d7b0d0a 100644
  133. --- a/src/mesa/main/formats.c
  134. +++ b/src/mesa/main/formats.c
  135. @@ -1455,6 +1455,8 @@ _mesa_format_matches_format_and_type(mesa_format mformat,
  136. switch (mformat) {
  137. case MESA_FORMAT_YUV420_2PLANE:
  138. case MESA_FORMAT_YVU420_2PLANE:
  139. + case MESA_FORMAT_YUV420_3PLANE:
  140. + case MESA_FORMAT_YVU420_3PLANE:
  141. return false;
  142. default:
  143. diff --git a/src/mesa/main/formats.csv b/src/mesa/main/formats.csv
  144. index b2d4765..825443b 100644
  145. --- a/src/mesa/main/formats.csv
  146. +++ b/src/mesa/main/formats.csv
  147. @@ -94,6 +94,8 @@ MESA_FORMAT_YCBCR , other , 1, 1, 1, x16 , , ,
  148. MESA_FORMAT_YCBCR_REV , other , 1, 1, 1, x16 , , , , xyzw, yuv
  149. MESA_FORMAT_YUV420_2PLANE , other , 1, 1, 1, x8 , , , , y___, yuv
  150. MESA_FORMAT_YVU420_2PLANE , other , 1, 1, 1, x8 , , , , y___, yuv
  151. +MESA_FORMAT_YUV420_3PLANE , other , 1, 1, 1, x8 , , , , y___, yuv
  152. +MESA_FORMAT_YVU420_3PLANE , other , 1, 1, 1, x8 , , , , y___, yuv
  153. MESA_FORMAT_RG_RB_UNORM8 , other , 2, 1, 1, x16 , , , , xyz1, rgb
  154. MESA_FORMAT_GR_BR_UNORM8 , other , 2, 1, 1, x16 , , , , xyz1, rgb
  155. diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
  156. index 0e778d6..1ab03d2 100644
  157. --- a/src/mesa/main/formats.h
  158. +++ b/src/mesa/main/formats.h
  159. @@ -624,6 +624,12 @@ typedef enum pipe_format mesa_format;
  160. #define HAVE_MESA_FORMAT_YVU420_2PLANE
  161. #define MESA_FORMAT_YVU420_2PLANE PIPE_FORMAT_YVU420_2PLANE
  162. +#define HAVE_MESA_FORMAT_YUV420_3PLANE
  163. +#define MESA_FORMAT_YUV420_3PLANE PIPE_FORMAT_YUV420_3PLANE
  164. +
  165. +#define HAVE_MESA_FORMAT_YVU420_3PLANE
  166. +#define MESA_FORMAT_YVU420_3PLANE PIPE_FORMAT_YVU420_3PLANE
  167. +
  168. #define MESA_FORMAT_COUNT PIPE_FORMAT_COUNT
  169. /* Packed to array format adapters */