Hi Ville, Regarding 3 plane YCbCr, DRM_FORMAT_yuv444 (non sub-sampled YCbCr) would also be useful. -Ilyes On Wed, Nov 16, 2011 at 7:42 PM, <ville.syrjala@xxxxxxxxxxxxxxx> wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > 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. Lower > case letters are used when listing the components to improve > readablility. I believe this convention matches the one used by pixman. > > 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@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/drm_crtc.c | 18 +++--- > drivers/gpu/drm/drm_crtc_helper.c | 39 ++++++++++++-- > drivers/gpu/drm/i915/intel_display.c | 18 ++++--- > include/drm/drm_fourcc.h | 96 ++++++++++++++++++++++++---------- > 4 files changed, 121 insertions(+), 50 deletions(-) > > diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c > index 30a70a4..761f265 100644 > --- a/drivers/gpu/drm/drm_crtc.c > +++ b/drivers/gpu/drm/drm_crtc.c > @@ -1918,28 +1918,28 @@ uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth) > > switch (bpp) { > case 8: > - fmt = DRM_FOURCC_RGB332; > + fmt = DRM_FORMAT_r3g3b2; > break; > case 16: > if (depth == 15) > - fmt = DRM_FOURCC_RGB555; > + fmt = DRM_FORMAT_x1r5g5b5; > else > - fmt = DRM_FOURCC_RGB565; > + fmt = DRM_FORMAT_r5g6b5; > break; > case 24: > - fmt = DRM_FOURCC_RGB24; > + fmt = DRM_FORMAT_r8g8b8; > break; > case 32: > if (depth == 24) > - fmt = DRM_FOURCC_RGB24; > + fmt = DRM_FORMAT_x8r8g8b8; > else if (depth == 30) > - fmt = DRM_INTEL_RGB30; > + fmt = DRM_FORMAT_x2r10g10b10; > else > - fmt = DRM_FOURCC_RGB32; > + fmt = DRM_FORMAT_a8r8g8b8; > break; > default: > - DRM_ERROR("bad bpp, assuming RGB24 pixel format\n"); > - fmt = DRM_FOURCC_RGB24; > + DRM_ERROR("bad bpp, assuming x8r8g8b8 pixel format\n"); > + fmt = DRM_FORMAT_x8r8g8b8; > break; > } > > diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c > index 3e0645c..4ef19d37 100644 > --- a/drivers/gpu/drm/drm_crtc_helper.c > +++ b/drivers/gpu/drm/drm_crtc_helper.c > @@ -816,27 +816,54 @@ void drm_helper_get_fb_bpp_depth(uint32_t format, unsigned int *depth, > int *bpp) > { > switch (format) { > - case DRM_FOURCC_RGB332: > + case DRM_FORMAT_r3g3b2: > + case DRM_FORMAT_b2g3r3: > *depth = 8; > *bpp = 8; > break; > - case DRM_FOURCC_RGB555: > + case DRM_FORMAT_x1r5g5b5: > + case DRM_FORMAT_x1b5g5r5: > + case DRM_FORMAT_r5g5b5x1: > + case DRM_FORMAT_b5g5r5x1: > + case DRM_FORMAT_a1r5g5b5: > + case DRM_FORMAT_a1b5g5r5: > + case DRM_FORMAT_r5g5b5a1: > + case DRM_FORMAT_b5g5r5a1: > *depth = 15; > *bpp = 16; > break; > - case DRM_FOURCC_RGB565: > + case DRM_FORMAT_r5g6b5: > + case DRM_FORMAT_b5g6r5: > *depth = 16; > *bpp = 16; > break; > - case DRM_FOURCC_RGB24: > + case DRM_FORMAT_r8g8b8: > + case DRM_FORMAT_b8g8r8: > + *depth = 24; > + *bpp = 24; > + break; > + case DRM_FORMAT_x8r8g8b8: > + case DRM_FORMAT_x8b8g8r8: > + case DRM_FORMAT_r8g8b8x8: > + case DRM_FORMAT_b8g8r8x8: > *depth = 24; > *bpp = 32; > break; > - case DRM_INTEL_RGB30: > + case DRM_FORMAT_x2r10g10b10: > + case DRM_FORMAT_x2b10g10r10: > + case DRM_FORMAT_r10g10b10x2: > + case DRM_FORMAT_b10g10r10x2: > + case DRM_FORMAT_a2r10g10b10: > + case DRM_FORMAT_a2b10g10r10: > + case DRM_FORMAT_r10g10b10a2: > + case DRM_FORMAT_b10g10r10a2: > *depth = 30; > *bpp = 32; > break; > - case DRM_FOURCC_RGB32: > + case DRM_FORMAT_a8r8g8b8: > + case DRM_FORMAT_a8b8g8r8: > + case DRM_FORMAT_r8g8b8a8: > + case DRM_FORMAT_b8g8r8a8: > *depth = 32; > *bpp = 32; > break; > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 50ae915..62c224a 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, > return -EINVAL; > > switch (mode_cmd->pixel_format) { > - case DRM_FOURCC_RGB332: > - case DRM_FOURCC_RGB565: > - case DRM_FOURCC_RGB24: > - case DRM_INTEL_RGB30: > + case DRM_FORMAT_r3g3b2: > + case DRM_FORMAT_r5g6b5: > + case DRM_FORMAT_x8r8g8b8: > + case DRM_FORMAT_a8r8g8b8: > + case DRM_FORMAT_x2r10g10b10: > + case DRM_FORMAT_a2r10g10b10: > /* RGB formats are common across chipsets */ > break; > - case DRM_FOURCC_YUYV: > - case DRM_FOURCC_UYVY: > - case DRM_FOURCC_YVYU: > - case DRM_FOURCC_VYUY: > + case DRM_FORMAT_yuyv: > + case DRM_FORMAT_uyvy: > + case DRM_FORMAT_yvyu: > + case DRM_FORMAT_vyuy: > break; > default: > DRM_ERROR("unsupported pixel format\n"); > diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h > index 48c3d10..8192275 100644 > --- a/include/drm/drm_fourcc.h > +++ b/include/drm/drm_fourcc.h > @@ -24,40 +24,82 @@ > #ifndef DRM_FOURCC_H > #define DRM_FOURCC_H > > -/* > - * We don't use the V4L header because > - * 1) the fourcc codes are well defined and trivial to construct > - * 2) we don't want user apps to have to pull in v4l headers just for fourcc > - * 3) the v4l fourcc codes are mixed up with a bunch of other code and are > - * part of the v4l API, so changing them to something linux-generic isn't > - * feasible > - * > - * So the below includes the fourcc codes used by the DRM and its drivers, > - * along with potential device specific codes. > - */ > - > #include <linux/types.h> > > #define fourcc_code(a,b,c,d) ((u32)(a) | ((u32)(b) << 8) | \ > ((u32)(c) << 16) | ((u32)(d) << 24)) > > -/* RGB codes */ > -#define DRM_FOURCC_RGB332 fourcc_code('R','G','B','1') > -#define DRM_FOURCC_RGB555 fourcc_code('R','G','B','O') > -#define DRM_FOURCC_RGB565 fourcc_code('R','G','B','P') > -#define DRM_FOURCC_RGB24 fourcc_code('R','G','B','3') > -#define DRM_FOURCC_RGB32 fourcc_code('R','G','B','4') > +/* color index */ > +#define DRM_FORMAT_c8 fourcc_code('C','8',' ',' ') /* [7:0] C */ > + > +/* 8 bpp RGB */ > +#define DRM_FORMAT_r3g3b2 fourcc_code('R','G','B','8') /* [7:0] R:G:B 3:3:2 */ > +#define DRM_FORMAT_b2g3r3 fourcc_code('B','G','R','8') /* [7:0] B:G:R 2:3:3 */ > + > +/* 16 bpp RGB */ > +#define DRM_FORMAT_x4r4g4b4 fourcc_code('X','R','1','2') /* [15:0] x:R:G:B 4:4:4:4 native endian */ > +#define DRM_FORMAT_x4b4g4r4 fourcc_code('X','B','1','2') /* [15:0] x:B:G:R 4:4:4:4 native endian */ > +#define DRM_FORMAT_r4g4b4x4 fourcc_code('R','X','1','2') /* [15:0] R:G:B:x 4:4:4:4 native endian */ > +#define DRM_FORMAT_b4g4r4x4 fourcc_code('B','X','1','2') /* [15:0] B:G:R:x 4:4:4:4 native endian */ > + > +#define DRM_FORMAT_x1r5g5b5 fourcc_code('X','R','1','5') /* [15:0] x:R:G:B 1:5:5:5 native endian */ > +#define DRM_FORMAT_x1b5g5r5 fourcc_code('X','B','1','5') /* [15:0] x:B:G:R 1:5:5:5 native endian */ > +#define DRM_FORMAT_r5g5b5x1 fourcc_code('R','X','1','5') /* [15:0] R:G:B:x 5:5:5:1 native endian */ > +#define DRM_FORMAT_b5g5r5x1 fourcc_code('B','X','1','5') /* [15:0] B:G:R:x 5:5:5:1 native endian */ > + > +#define DRM_FORMAT_a1r5g5b5 fourcc_code('A','R','1','5') /* [15:0] A:R:G:B 1:5:5:5 native endian */ > +#define DRM_FORMAT_a1b5g5r5 fourcc_code('A','B','1','5') /* [15:0] A:B:G:R 1:5:5:5 native endian */ > +#define DRM_FORMAT_r5g5b5a1 fourcc_code('R','A','1','5') /* [15:0] R:G:B:A 5:5:5:1 native endian */ > +#define DRM_FORMAT_b5g5r5a1 fourcc_code('B','A','1','5') /* [15:0] B:G:R:A 5:5:5:1 native endian */ > + > +#define DRM_FORMAT_r5g6b5 fourcc_code('R','G','1','6') /* [15:0] R:G:B 5:6:5 native endian */ > +#define DRM_FORMAT_b5g6r5 fourcc_code('B','G','1','6') /* [15:0] B:G:R 5:6:5 native endian */ > + > +/* 24 bpp RGB */ > +#define DRM_FORMAT_r8g8b8 fourcc_code('R','G','2','4') /* [23:0] R:G:B native endian */ > +#define DRM_FORMAT_b8g8r8 fourcc_code('B','G','2','4') /* [23:0] B:G:R native endian */ > + > +/* 32 bpp RGB */ > +#define DRM_FORMAT_x8r8g8b8 fourcc_code('X','R','2','4') /* [31:0] x:R:G:B 8:8:8:8 native endian */ > +#define DRM_FORMAT_x8b8g8r8 fourcc_code('X','B','2','4') /* [31:0] x:B:G:R 8:8:8:8 native endian */ > +#define DRM_FORMAT_r8g8b8x8 fourcc_code('R','X','2','4') /* [31:0] R:G:B:x 8:8:8:8 native endian */ > +#define DRM_FORMAT_b8g8r8x8 fourcc_code('B','X','2','4') /* [31:0] B:G:R:x 8:8:8:8 native endian */ > + > +#define DRM_FORMAT_a8r8g8b8 fourcc_code('A','R','2','4') /* [31:0] A:R:G:B 8:8:8:8 native endian */ > +#define DRM_FORMAT_a8b8g8r8 fourcc_code('A','B','2','4') /* [31:0] A:B:G:R 8:8:8:8 native endian */ > +#define DRM_FORMAT_r8g8b8a8 fourcc_code('R','A','2','4') /* [31:0] R:G:B:A 8:8:8:8 native endian */ > +#define DRM_FORMAT_b8g8r8a8 fourcc_code('B','A','2','4') /* [31:0] B:G:R:A 8:8:8:8 native endian */ > + > +#define DRM_FORMAT_x2r10g10b10 fourcc_code('X','R','3','0') /* [31:0] x:R:G:B 2:10:10:10 native endian */ > +#define DRM_FORMAT_x2b10g10r10 fourcc_code('X','B','3','0') /* [31:0] x:B:G:R 2:10:10:10 native endian */ > +#define DRM_FORMAT_r10g10b10x2 fourcc_code('R','X','3','0') /* [31:0] R:G:B:x 10:10:10:2 native endian */ > +#define DRM_FORMAT_b10g10r10x2 fourcc_code('B','X','3','0') /* [31:0] B:G:R:x 10:10:10:2 native endian */ > + > +#define DRM_FORMAT_a2r10g10b10 fourcc_code('A','R','3','0') /* [31:0] A:R:G:B 2:10:10:10 native endian */ > +#define DRM_FORMAT_a2b10g10r10 fourcc_code('A','B','3','0') /* [31:0] A:B:G:R 2:10:10:10 native endian */ > +#define DRM_FORMAT_r10g10b10a2 fourcc_code('R','A','3','0') /* [31:0] R:G:B:A 10:10:10:2 native endian */ > +#define DRM_FORMAT_b10g10r10a2 fourcc_code('B','A','3','0') /* [31:0] B:G:R:A 10:10:10:2 native endian */ > > -#define DRM_FOURCC_BGR24 fourcc_code('B','G','R','3') > -#define DRM_FOURCC_BGR32 fourcc_code('B','G','R','4') > +/* packed YCbCr */ > +#define DRM_FORMAT_yuyv fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr:Y1:Cb:Y0 8:8:8:8 little endian */ > +#define DRM_FORMAT_yvyu fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb:Y1:Cr:Y0 8:8:8:8 little endian */ > +#define DRM_FORMAT_uyvy fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr:Y0:Cb 8:8:8:8 little endian */ > +#define DRM_FORMAT_vyuy fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb:Y0:Cr 8:8:8:8 little endian */ > > -/* YUV codes */ > -#define DRM_FOURCC_YUYV fourcc_code('Y', 'U', 'Y', 'V') > -#define DRM_FOURCC_YVYU fourcc_code('Y', 'V', 'Y', 'U') > -#define DRM_FOURCC_UYVY fourcc_code('U', 'Y', 'V', 'Y') > -#define DRM_FOURCC_VYUY fourcc_code('V', 'Y', 'U', 'Y') > +/* 2 plane YCbCr */ > +#define DRM_FORMAT_nv12 fourcc_code('N', 'V', '1', '2') /* Y plane and 2x2 subsampled [15:0] Cr:Cb 8:8 little endian plane */ > +#define DRM_FORMAT_nv21 fourcc_code('N', 'V', '2', '1') /* Y plane and 2x2 subsampled [15:0] Cb:Cr 8:8 little endian plane */ > +#define DRM_FORMAT_nv16 fourcc_code('N', 'V', '1', '6') /* Y plane and 2x1 subsampled [15:0] Cr:Cb 8:8 little endian plane */ > +#define DRM_FORMAT_nv61 fourcc_code('N', 'V', '6', '1') /* Y plane and 2x1 subsampled [15:0] Cb:Cr 8:8 little endian plane */ > > -/* DRM specific codes */ > -#define DRM_INTEL_RGB30 fourcc_code('R','G','B','0') /* RGB x:10:10:10 */ > +/* 3 plane YCbCr */ > +#define DRM_FORMAT_yuv410 fourcc_code('Y', 'U', 'V', '9') /* Y plane and 4x4 subsampled Cb and Cr planes */ > +#define DRM_FORMAT_yvu410 fourcc_code('Y', 'V', 'U', '9') /* Y plane and 4x4 subsampled Cr and Cb planes */ > +#define DRM_FORMAT_yuv411 fourcc_code('Y', 'U', '1', '1') /* Y plane and 4x1 subsampled Cb and Cr planes */ > +#define DRM_FORMAT_yvu411 fourcc_code('Y', 'V', '1', '1') /* Y plane and 4x1 subsampled Cr and Cb planes */ > +#define DRM_FORMAT_yuv420 fourcc_code('Y', 'U', '1', '2') /* Y plane and 2x2 subsampled Cb and Cr planes */ > +#define DRM_FORMAT_yvu420 fourcc_code('Y', 'V', '1', '2') /* Y plane and 2x2 subsampled Cr and Cb planes */ > +#define DRM_FORMAT_yuv422 fourcc_code('Y', 'U', '1', '6') /* Y plane and 2x1 subsampled Cb and Cr planes */ > +#define DRM_FORMAT_yvu422 fourcc_code('Y', 'V', '1', '6') /* Y plane and 2x1 subsampled Cr and Cb planes */ > > #endif /* DRM_FOURCC_H */ > -- > 1.7.3.4 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel