Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: Redefine pixel formats

Name the formats as DRM_FORMAT_X instead of DRM_FOURCC_X. Use consistent
names, especially for the RGB formats. Component order and byte order are
now strictly specified for each format.

The RGB format naming follows a convention where the components names
and sizes are listed from left to right, matching the order within a
single pixel from most significant bit to least significant bit.

The YUV format names vary more. For the 4:2:2 packed formats and 2
plane formats use the fourcc. For the three plane formats the
name includes the plane order and subsampling information using the
standard subsampling notation. Some of those also happen to match
the official fourcc definition.

The fourccs for for all the RGB formats and some of the YUV formats
I invented myself. The idea was that looking at just the fourcc you
get some idea what the format is about without having to decode it
using some external reference.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Ville Syrjälä and committed by
Dave Airlie
04b3924d 248dbc23

+146 -50
+42 -15
drivers/gpu/drm/drm_crtc.c
··· 1923 1923 1924 1924 switch (bpp) { 1925 1925 case 8: 1926 - fmt = DRM_FOURCC_RGB332; 1926 + fmt = DRM_FORMAT_RGB332; 1927 1927 break; 1928 1928 case 16: 1929 1929 if (depth == 15) 1930 - fmt = DRM_FOURCC_RGB555; 1930 + fmt = DRM_FORMAT_XRGB1555; 1931 1931 else 1932 - fmt = DRM_FOURCC_RGB565; 1932 + fmt = DRM_FORMAT_RGB565; 1933 1933 break; 1934 1934 case 24: 1935 - fmt = DRM_FOURCC_RGB24; 1935 + fmt = DRM_FORMAT_RGB888; 1936 1936 break; 1937 1937 case 32: 1938 1938 if (depth == 24) 1939 - fmt = DRM_FOURCC_RGB24; 1939 + fmt = DRM_FORMAT_XRGB8888; 1940 1940 else if (depth == 30) 1941 - fmt = DRM_INTEL_RGB30; 1941 + fmt = DRM_FORMAT_XRGB2101010; 1942 1942 else 1943 - fmt = DRM_FOURCC_RGB32; 1943 + fmt = DRM_FORMAT_ARGB8888; 1944 1944 break; 1945 1945 default: 1946 - DRM_ERROR("bad bpp, assuming RGB24 pixel format\n"); 1947 - fmt = DRM_FOURCC_RGB24; 1946 + DRM_ERROR("bad bpp, assuming x8r8g8b8 pixel format\n"); 1947 + fmt = DRM_FORMAT_XRGB8888; 1948 1948 break; 1949 1949 } 1950 1950 ··· 3145 3145 int *bpp) 3146 3146 { 3147 3147 switch (format) { 3148 - case DRM_FOURCC_RGB332: 3148 + case DRM_FORMAT_RGB332: 3149 + case DRM_FORMAT_BGR233: 3149 3150 *depth = 8; 3150 3151 *bpp = 8; 3151 3152 break; 3152 - case DRM_FOURCC_RGB555: 3153 + case DRM_FORMAT_XRGB1555: 3154 + case DRM_FORMAT_XBGR1555: 3155 + case DRM_FORMAT_RGBX5551: 3156 + case DRM_FORMAT_BGRX5551: 3157 + case DRM_FORMAT_ARGB1555: 3158 + case DRM_FORMAT_ABGR1555: 3159 + case DRM_FORMAT_RGBA5551: 3160 + case DRM_FORMAT_BGRA5551: 3153 3161 *depth = 15; 3154 3162 *bpp = 16; 3155 3163 break; 3156 - case DRM_FOURCC_RGB565: 3164 + case DRM_FORMAT_RGB565: 3165 + case DRM_FORMAT_BGR565: 3157 3166 *depth = 16; 3158 3167 *bpp = 16; 3159 3168 break; 3160 - case DRM_FOURCC_RGB24: 3169 + case DRM_FORMAT_RGB888: 3170 + case DRM_FORMAT_BGR888: 3171 + *depth = 24; 3172 + *bpp = 24; 3173 + break; 3174 + case DRM_FORMAT_XRGB8888: 3175 + case DRM_FORMAT_XBGR8888: 3176 + case DRM_FORMAT_RGBX8888: 3177 + case DRM_FORMAT_BGRX8888: 3161 3178 *depth = 24; 3162 3179 *bpp = 32; 3163 3180 break; 3164 - case DRM_INTEL_RGB30: 3181 + case DRM_FORMAT_XRGB2101010: 3182 + case DRM_FORMAT_XBGR2101010: 3183 + case DRM_FORMAT_RGBX1010102: 3184 + case DRM_FORMAT_BGRX1010102: 3185 + case DRM_FORMAT_ARGB2101010: 3186 + case DRM_FORMAT_ABGR2101010: 3187 + case DRM_FORMAT_RGBA1010102: 3188 + case DRM_FORMAT_BGRA1010102: 3165 3189 *depth = 30; 3166 3190 *bpp = 32; 3167 3191 break; 3168 - case DRM_FOURCC_RGB32: 3192 + case DRM_FORMAT_ARGB8888: 3193 + case DRM_FORMAT_ABGR8888: 3194 + case DRM_FORMAT_RGBA8888: 3195 + case DRM_FORMAT_BGRA8888: 3169 3196 *depth = 32; 3170 3197 *bpp = 32; 3171 3198 break;
+10 -8
drivers/gpu/drm/i915/intel_display.c
··· 7585 7585 return -EINVAL; 7586 7586 7587 7587 switch (mode_cmd->pixel_format) { 7588 - case DRM_FOURCC_RGB332: 7589 - case DRM_FOURCC_RGB565: 7590 - case DRM_FOURCC_RGB24: 7591 - case DRM_INTEL_RGB30: 7588 + case DRM_FORMAT_RGB332: 7589 + case DRM_FORMAT_RGB565: 7590 + case DRM_FORMAT_XRGB8888: 7591 + case DRM_FORMAT_ARGB8888: 7592 + case DRM_FORMAT_XRGB2101010: 7593 + case DRM_FORMAT_ARGB2101010: 7592 7594 /* RGB formats are common across chipsets */ 7593 7595 break; 7594 - case DRM_FOURCC_YUYV: 7595 - case DRM_FOURCC_UYVY: 7596 - case DRM_FOURCC_YVYU: 7597 - case DRM_FOURCC_VYUY: 7596 + case DRM_FORMAT_YUYV: 7597 + case DRM_FORMAT_UYVY: 7598 + case DRM_FORMAT_YVYU: 7599 + case DRM_FORMAT_VYUY: 7598 7600 break; 7599 7601 default: 7600 7602 DRM_ERROR("unsupported pixel format\n");
+94 -27
include/drm/drm_fourcc.h
··· 24 24 #ifndef DRM_FOURCC_H 25 25 #define DRM_FOURCC_H 26 26 27 - /* 28 - * We don't use the V4L header because 29 - * 1) the fourcc codes are well defined and trivial to construct 30 - * 2) we don't want user apps to have to pull in v4l headers just for fourcc 31 - * 3) the v4l fourcc codes are mixed up with a bunch of other code and are 32 - * part of the v4l API, so changing them to something linux-generic isn't 33 - * feasible 34 - * 35 - * So the below includes the fourcc codes used by the DRM and its drivers, 36 - * along with potential device specific codes. 37 - */ 38 - 39 27 #include <linux/types.h> 40 28 41 29 #define fourcc_code(a,b,c,d) ((u32)(a) | ((u32)(b) << 8) | \ 42 30 ((u32)(c) << 16) | ((u32)(d) << 24)) 43 31 44 - /* RGB codes */ 45 - #define DRM_FOURCC_RGB332 fourcc_code('R','G','B','1') 46 - #define DRM_FOURCC_RGB555 fourcc_code('R','G','B','O') 47 - #define DRM_FOURCC_RGB565 fourcc_code('R','G','B','P') 48 - #define DRM_FOURCC_RGB24 fourcc_code('R','G','B','3') 49 - #define DRM_FOURCC_RGB32 fourcc_code('R','G','B','4') 32 + #define DRM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */ 50 33 51 - #define DRM_FOURCC_BGR24 fourcc_code('B','G','R','3') 52 - #define DRM_FOURCC_BGR32 fourcc_code('B','G','R','4') 34 + /* color index */ 35 + #define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */ 53 36 54 - /* YUV codes */ 55 - #define DRM_FOURCC_YUYV fourcc_code('Y', 'U', 'Y', 'V') 56 - #define DRM_FOURCC_YVYU fourcc_code('Y', 'V', 'Y', 'U') 57 - #define DRM_FOURCC_UYVY fourcc_code('U', 'Y', 'V', 'Y') 58 - #define DRM_FOURCC_VYUY fourcc_code('V', 'Y', 'U', 'Y') 37 + /* 8 bpp RGB */ 38 + #define DRM_FORMAT_RGB332 fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */ 39 + #define DRM_FORMAT_BGR233 fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */ 59 40 60 - /* DRM specific codes */ 61 - #define DRM_INTEL_RGB30 fourcc_code('R','G','B','0') /* RGB x:10:10:10 */ 41 + /* 16 bpp RGB */ 42 + #define DRM_FORMAT_XRGB4444 fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */ 43 + #define DRM_FORMAT_XBGR4444 fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */ 44 + #define DRM_FORMAT_RGBX4444 fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */ 45 + #define DRM_FORMAT_BGRX4444 fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */ 46 + 47 + #define DRM_FORMAT_ARGB4444 fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */ 48 + #define DRM_FORMAT_ABGR4444 fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */ 49 + #define DRM_FORMAT_RGBA4444 fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */ 50 + #define DRM_FORMAT_BGRA4444 fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */ 51 + 52 + #define DRM_FORMAT_XRGB1555 fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */ 53 + #define DRM_FORMAT_XBGR1555 fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */ 54 + #define DRM_FORMAT_RGBX5551 fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */ 55 + #define DRM_FORMAT_BGRX5551 fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */ 56 + 57 + #define DRM_FORMAT_ARGB1555 fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */ 58 + #define DRM_FORMAT_ABGR1555 fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */ 59 + #define DRM_FORMAT_RGBA5551 fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */ 60 + #define DRM_FORMAT_BGRA5551 fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */ 61 + 62 + #define DRM_FORMAT_RGB565 fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */ 63 + #define DRM_FORMAT_BGR565 fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */ 64 + 65 + /* 24 bpp RGB */ 66 + #define DRM_FORMAT_RGB888 fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */ 67 + #define DRM_FORMAT_BGR888 fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */ 68 + 69 + /* 32 bpp RGB */ 70 + #define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */ 71 + #define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */ 72 + #define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */ 73 + #define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */ 74 + 75 + #define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */ 76 + #define DRM_FORMAT_ABGR8888 fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */ 77 + #define DRM_FORMAT_RGBA8888 fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */ 78 + #define DRM_FORMAT_BGRA8888 fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */ 79 + 80 + #define DRM_FORMAT_XRGB2101010 fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */ 81 + #define DRM_FORMAT_XBGR2101010 fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */ 82 + #define DRM_FORMAT_RGBX1010102 fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */ 83 + #define DRM_FORMAT_BGRX1010102 fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */ 84 + 85 + #define DRM_FORMAT_ARGB2101010 fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */ 86 + #define DRM_FORMAT_ABGR2101010 fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */ 87 + #define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */ 88 + #define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */ 89 + 90 + /* packed YCbCr */ 91 + #define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */ 92 + #define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */ 93 + #define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */ 94 + #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ 95 + 96 + #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ 97 + 98 + /* 99 + * 2 plane YCbCr 100 + * index 0 = Y plane, [7:0] Y 101 + * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian 102 + * or 103 + * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian 104 + */ 105 + #define DRM_FORMAT_NV12 fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */ 106 + #define DRM_FORMAT_NV21 fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */ 107 + #define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */ 108 + #define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */ 109 + 110 + /* 111 + * 3 plane YCbCr 112 + * index 0: Y plane, [7:0] Y 113 + * index 1: Cb plane, [7:0] Cb 114 + * index 2: Cr plane, [7:0] Cr 115 + * or 116 + * index 1: Cr plane, [7:0] Cr 117 + * index 2: Cb plane, [7:0] Cb 118 + */ 119 + #define DRM_FORMAT_YUV410 fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */ 120 + #define DRM_FORMAT_YVU410 fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */ 121 + #define DRM_FORMAT_YUV411 fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */ 122 + #define DRM_FORMAT_YVU411 fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */ 123 + #define DRM_FORMAT_YUV420 fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */ 124 + #define DRM_FORMAT_YVU420 fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */ 125 + #define DRM_FORMAT_YUV422 fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */ 126 + #define DRM_FORMAT_YVU422 fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */ 127 + #define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */ 128 + #define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */ 62 129 63 130 #endif /* DRM_FOURCC_H */