aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2011-11-17 11:05:13 -0500
committerDave Airlie <airlied@redhat.com>2011-12-01 09:16:10 -0500
commit04b3924db60f974d2b4af0b2e19a0ae7ca202dc7 (patch)
treef16a79ad676ba2333ee5af9c431b9882d574af9e
parent248dbc2350501e2c7b9f5ceb60c75515d82f4134 (diff)
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>
-rw-r--r--drivers/gpu/drm/drm_crtc.c57
-rw-r--r--drivers/gpu/drm/i915/intel_display.c18
-rw-r--r--include/drm/drm_fourcc.h121
3 files changed, 146 insertions, 50 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 07c80fd7a98d..1dfc28600751 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1923,28 +1923,28 @@ uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
1923 1923
1924 switch (bpp) { 1924 switch (bpp) {
1925 case 8: 1925 case 8:
1926 fmt = DRM_FOURCC_RGB332; 1926 fmt = DRM_FORMAT_RGB332;
1927 break; 1927 break;
1928 case 16: 1928 case 16:
1929 if (depth == 15) 1929 if (depth == 15)
1930 fmt = DRM_FOURCC_RGB555; 1930 fmt = DRM_FORMAT_XRGB1555;
1931 else 1931 else
1932 fmt = DRM_FOURCC_RGB565; 1932 fmt = DRM_FORMAT_RGB565;
1933 break; 1933 break;
1934 case 24: 1934 case 24:
1935 fmt = DRM_FOURCC_RGB24; 1935 fmt = DRM_FORMAT_RGB888;
1936 break; 1936 break;
1937 case 32: 1937 case 32:
1938 if (depth == 24) 1938 if (depth == 24)
1939 fmt = DRM_FOURCC_RGB24; 1939 fmt = DRM_FORMAT_XRGB8888;
1940 else if (depth == 30) 1940 else if (depth == 30)
1941 fmt = DRM_INTEL_RGB30; 1941 fmt = DRM_FORMAT_XRGB2101010;
1942 else 1942 else
1943 fmt = DRM_FOURCC_RGB32; 1943 fmt = DRM_FORMAT_ARGB8888;
1944 break; 1944 break;
1945 default: 1945 default:
1946 DRM_ERROR("bad bpp, assuming RGB24 pixel format\n"); 1946 DRM_ERROR("bad bpp, assuming x8r8g8b8 pixel format\n");
1947 fmt = DRM_FOURCC_RGB24; 1947 fmt = DRM_FORMAT_XRGB8888;
1948 break; 1948 break;
1949 } 1949 }
1950 1950
@@ -3145,27 +3145,54 @@ void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
3145 int *bpp) 3145 int *bpp)
3146{ 3146{
3147 switch (format) { 3147 switch (format) {
3148 case DRM_FOURCC_RGB332: 3148 case DRM_FORMAT_RGB332:
3149 case DRM_FORMAT_BGR233:
3149 *depth = 8; 3150 *depth = 8;
3150 *bpp = 8; 3151 *bpp = 8;
3151 break; 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 *depth = 15; 3161 *depth = 15;
3154 *bpp = 16; 3162 *bpp = 16;
3155 break; 3163 break;
3156 case DRM_FOURCC_RGB565: 3164 case DRM_FORMAT_RGB565:
3165 case DRM_FORMAT_BGR565:
3157 *depth = 16; 3166 *depth = 16;
3158 *bpp = 16; 3167 *bpp = 16;
3159 break; 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 *depth = 24; 3178 *depth = 24;
3162 *bpp = 32; 3179 *bpp = 32;
3163 break; 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 *depth = 30; 3189 *depth = 30;
3166 *bpp = 32; 3190 *bpp = 32;
3167 break; 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 *depth = 32; 3196 *depth = 32;
3170 *bpp = 32; 3197 *bpp = 32;
3171 break; 3198 break;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 50ae9157befe..0bc93c3cd447 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7585,16 +7585,18 @@ int intel_framebuffer_init(struct drm_device *dev,
7585 return -EINVAL; 7585 return -EINVAL;
7586 7586
7587 switch (mode_cmd->pixel_format) { 7587 switch (mode_cmd->pixel_format) {
7588 case DRM_FOURCC_RGB332: 7588 case DRM_FORMAT_RGB332:
7589 case DRM_FOURCC_RGB565: 7589 case DRM_FORMAT_RGB565:
7590 case DRM_FOURCC_RGB24: 7590 case DRM_FORMAT_XRGB8888:
7591 case DRM_INTEL_RGB30: 7591 case DRM_FORMAT_ARGB8888:
7592 case DRM_FORMAT_XRGB2101010:
7593 case DRM_FORMAT_ARGB2101010:
7592 /* RGB formats are common across chipsets */ 7594 /* RGB formats are common across chipsets */
7593 break; 7595 break;
7594 case DRM_FOURCC_YUYV: 7596 case DRM_FORMAT_YUYV:
7595 case DRM_FOURCC_UYVY: 7597 case DRM_FORMAT_UYVY:
7596 case DRM_FOURCC_YVYU: 7598 case DRM_FORMAT_YVYU:
7597 case DRM_FOURCC_VYUY: 7599 case DRM_FORMAT_VYUY:
7598 break; 7600 break;
7599 default: 7601 default:
7600 DRM_ERROR("unsupported pixel format\n"); 7602 DRM_ERROR("unsupported pixel format\n");
diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h
index 48c3d107a8fa..bb75249bfbae 100644
--- a/include/drm/drm_fourcc.h
+++ b/include/drm/drm_fourcc.h
@@ -24,40 +24,107 @@
24#ifndef DRM_FOURCC_H 24#ifndef DRM_FOURCC_H
25#define DRM_FOURCC_H 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#include <linux/types.h> 27#include <linux/types.h>
40 28
41#define fourcc_code(a,b,c,d) ((u32)(a) | ((u32)(b) << 8) | \ 29#define fourcc_code(a,b,c,d) ((u32)(a) | ((u32)(b) << 8) | \
42 ((u32)(c) << 16) | ((u32)(d) << 24)) 30 ((u32)(c) << 16) | ((u32)(d) << 24))
43 31
44/* RGB codes */ 32#define DRM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */
45#define DRM_FOURCC_RGB332 fourcc_code('R','G','B','1') 33
46#define DRM_FOURCC_RGB555 fourcc_code('R','G','B','O') 34/* color index */
47#define DRM_FOURCC_RGB565 fourcc_code('R','G','B','P') 35#define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
48#define DRM_FOURCC_RGB24 fourcc_code('R','G','B','3') 36
49#define DRM_FOURCC_RGB32 fourcc_code('R','G','B','4') 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 */
40
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 */
50 64
51#define DRM_FOURCC_BGR24 fourcc_code('B','G','R','3') 65/* 24 bpp RGB */
52#define DRM_FOURCC_BGR32 fourcc_code('B','G','R','4') 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 */
53 68
54/* YUV codes */ 69/* 32 bpp RGB */
55#define DRM_FOURCC_YUYV fourcc_code('Y', 'U', 'Y', 'V') 70#define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */
56#define DRM_FOURCC_YVYU fourcc_code('Y', 'V', 'Y', 'U') 71#define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */
57#define DRM_FOURCC_UYVY fourcc_code('U', 'Y', 'V', 'Y') 72#define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */
58#define DRM_FOURCC_VYUY fourcc_code('V', 'Y', 'U', 'Y') 73#define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */
59 74
60/* DRM specific codes */ 75#define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */
61#define DRM_INTEL_RGB30 fourcc_code('R','G','B','0') /* RGB x:10:10:10 */ 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#endif /* DRM_FOURCC_H */ 130#endif /* DRM_FOURCC_H */