2011-11-15 06:51:28 +08:00
|
|
|
/*
|
|
|
|
* Copyright 2011 Intel Corporation
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice (including the next
|
|
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
|
|
* Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
|
|
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
|
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
|
|
* OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef DRM_FOURCC_H
|
|
|
|
#define DRM_FOURCC_H
|
|
|
|
|
2015-11-30 22:10:42 +08:00
|
|
|
#include "drm.h"
|
2011-11-15 06:51:28 +08:00
|
|
|
|
2016-04-08 01:49:00 +08:00
|
|
|
#if defined(__cplusplus)
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2018-08-22 00:16:11 +08:00
|
|
|
/**
|
|
|
|
* DOC: overview
|
|
|
|
*
|
|
|
|
* In the DRM subsystem, framebuffer pixel formats are described using the
|
|
|
|
* fourcc codes defined in `include/uapi/drm/drm_fourcc.h`. In addition to the
|
|
|
|
* fourcc code, a Format Modifier may optionally be provided, in order to
|
|
|
|
* further describe the buffer's format - for example tiling or compression.
|
|
|
|
*
|
|
|
|
* Format Modifiers
|
|
|
|
* ----------------
|
|
|
|
*
|
|
|
|
* Format modifiers are used in conjunction with a fourcc code, forming a
|
|
|
|
* unique fourcc:modifier pair. This format:modifier pair must fully define the
|
|
|
|
* format and data layout of the buffer, and should be the only way to describe
|
|
|
|
* that particular buffer.
|
|
|
|
*
|
|
|
|
* Having multiple fourcc:modifier pairs which describe the same layout should
|
|
|
|
* be avoided, as such aliases run the risk of different drivers exposing
|
|
|
|
* different names for the same data format, forcing userspace to understand
|
|
|
|
* that they are aliases.
|
|
|
|
*
|
|
|
|
* Format modifiers may change any property of the buffer, including the number
|
|
|
|
* of planes and/or the required allocation size. Format modifiers are
|
|
|
|
* vendor-namespaced, and as such the relationship between a fourcc code and a
|
|
|
|
* modifier is specific to the modifer being used. For example, some modifiers
|
|
|
|
* may preserve meaning - such as number of planes - from the fourcc code,
|
|
|
|
* whereas others may not.
|
|
|
|
*
|
|
|
|
* Vendors should document their modifier usage in as much detail as
|
|
|
|
* possible, to ensure maximum compatibility across devices, drivers and
|
|
|
|
* applications.
|
|
|
|
*
|
|
|
|
* The authoritative list of format modifier codes is found in
|
|
|
|
* `include/uapi/drm/drm_fourcc.h`
|
|
|
|
*/
|
|
|
|
|
2011-12-20 06:06:40 +08:00
|
|
|
#define fourcc_code(a, b, c, d) ((__u32)(a) | ((__u32)(b) << 8) | \
|
|
|
|
((__u32)(c) << 16) | ((__u32)(d) << 24))
|
2011-11-15 06:51:28 +08:00
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
#define DRM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */
|
|
|
|
|
2018-09-05 23:31:16 +08:00
|
|
|
/* Reserve 0 for the invalid format specifier */
|
|
|
|
#define DRM_FORMAT_INVALID 0
|
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
/* color index */
|
|
|
|
#define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
|
|
|
|
|
2015-07-09 16:38:42 +08:00
|
|
|
/* 8 bpp Red */
|
|
|
|
#define DRM_FORMAT_R8 fourcc_code('R', '8', ' ', ' ') /* [7:0] R */
|
|
|
|
|
2017-01-05 02:38:55 +08:00
|
|
|
/* 16 bpp Red */
|
|
|
|
#define DRM_FORMAT_R16 fourcc_code('R', '1', '6', ' ') /* [15:0] R little endian */
|
|
|
|
|
2015-07-09 16:38:42 +08:00
|
|
|
/* 16 bpp RG */
|
|
|
|
#define DRM_FORMAT_RG88 fourcc_code('R', 'G', '8', '8') /* [15:0] R:G 8:8 little endian */
|
|
|
|
#define DRM_FORMAT_GR88 fourcc_code('G', 'R', '8', '8') /* [15:0] G:R 8:8 little endian */
|
|
|
|
|
2017-01-05 02:38:55 +08:00
|
|
|
/* 32 bpp RG */
|
|
|
|
#define DRM_FORMAT_RG1616 fourcc_code('R', 'G', '3', '2') /* [31:0] R:G 16:16 little endian */
|
|
|
|
#define DRM_FORMAT_GR1616 fourcc_code('G', 'R', '3', '2') /* [31:0] G:R 16:16 little endian */
|
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
/* 8 bpp RGB */
|
|
|
|
#define DRM_FORMAT_RGB332 fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */
|
|
|
|
#define DRM_FORMAT_BGR233 fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */
|
|
|
|
|
|
|
|
/* 16 bpp RGB */
|
|
|
|
#define DRM_FORMAT_XRGB4444 fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */
|
|
|
|
#define DRM_FORMAT_XBGR4444 fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */
|
|
|
|
#define DRM_FORMAT_RGBX4444 fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */
|
|
|
|
#define DRM_FORMAT_BGRX4444 fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_ARGB4444 fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */
|
|
|
|
#define DRM_FORMAT_ABGR4444 fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */
|
|
|
|
#define DRM_FORMAT_RGBA4444 fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */
|
|
|
|
#define DRM_FORMAT_BGRA4444 fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_XRGB1555 fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */
|
|
|
|
#define DRM_FORMAT_XBGR1555 fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */
|
|
|
|
#define DRM_FORMAT_RGBX5551 fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */
|
|
|
|
#define DRM_FORMAT_BGRX5551 fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_ARGB1555 fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */
|
|
|
|
#define DRM_FORMAT_ABGR1555 fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */
|
|
|
|
#define DRM_FORMAT_RGBA5551 fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */
|
|
|
|
#define DRM_FORMAT_BGRA5551 fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_RGB565 fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */
|
|
|
|
#define DRM_FORMAT_BGR565 fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */
|
2011-11-15 06:51:28 +08:00
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
/* 24 bpp RGB */
|
|
|
|
#define DRM_FORMAT_RGB888 fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */
|
|
|
|
#define DRM_FORMAT_BGR888 fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */
|
2011-11-15 06:51:28 +08:00
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
/* 32 bpp RGB */
|
|
|
|
#define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */
|
2011-11-15 06:51:28 +08:00
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
#define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_ABGR8888 fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_RGBA8888 fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_BGRA8888 fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_XRGB2101010 fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */
|
|
|
|
#define DRM_FORMAT_XBGR2101010 fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */
|
|
|
|
#define DRM_FORMAT_RGBX1010102 fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */
|
|
|
|
#define DRM_FORMAT_BGRX1010102 fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_ARGB2101010 fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */
|
|
|
|
#define DRM_FORMAT_ABGR2101010 fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */
|
|
|
|
#define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */
|
|
|
|
#define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */
|
|
|
|
|
2019-03-13 08:38:30 +08:00
|
|
|
/*
|
|
|
|
* Floating point 64bpp RGB
|
|
|
|
* IEEE 754-2008 binary16 half-precision float
|
|
|
|
* [15:0] sign:exponent:mantissa 1:5:10
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_XRGB16161616F fourcc_code('X', 'R', '4', 'H') /* [63:0] x:R:G:B 16:16:16:16 little endian */
|
|
|
|
#define DRM_FORMAT_XBGR16161616F fourcc_code('X', 'B', '4', 'H') /* [63:0] x:B:G:R 16:16:16:16 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_ARGB16161616F fourcc_code('A', 'R', '4', 'H') /* [63:0] A:R:G:B 16:16:16:16 little endian */
|
|
|
|
#define DRM_FORMAT_ABGR16161616F fourcc_code('A', 'B', '4', 'H') /* [63:0] A:B:G:R 16:16:16:16 little endian */
|
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
/* packed YCbCr */
|
|
|
|
#define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
|
2019-03-19 20:17:02 +08:00
|
|
|
#define DRM_FORMAT_XYUV8888 fourcc_code('X', 'Y', 'U', 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */
|
drm/fourcc: Add AFBC yuv fourccs for Mali
As we look to enable AFBC using DRM format modifiers, we run into
problems which we've historically handled via vendor-private details
(i.e. gralloc, on Android).
AFBC (as an encoding) is fully flexible, and for example YUV data can
be encoded into 1, 2 or 3 encoded "planes", much like the linear
equivalents. Component order is also meaningful, as AFBC doesn't
necessarily care about what each "channel" of the data it encodes
contains. Therefore ABGR8888 and RGBA8888 can be encoded in AFBC with
different representations. Similarly, 'X' components may be encoded
into AFBC streams in cases where a decoder expects to decode a 4th
component.
In addition, AFBC is a licensable IP, meaning that to support the
ecosystem we need to ensure that _all_ AFBC users are able to describe
the encodings that they need. This is much better achieved by
preserving meaning in the fourcc codes when they are combined with an
AFBC modifier.
In essence, we want to use the modifier to describe the parameters of
the AFBC encode/decode, and use the fourcc code to describe the data
being encoded/decoded.
To do anything different would be to introduce redundancy - we would
need to duplicate in the modifier information which is _already_
conveyed clearly and non-ambigiously by a fourcc code.
I hope that for RGB this is non-controversial.
(BGRA8888 + MODIFIER_AFBC) is a different format from
(RGBA8888 + MODIFIER_AFBC).
Possibly more controversial is that (XBGR8888 + MODIFIER_AFBC)
is different from (BGR888 + MODIFIER_AFBC). I understand that in some
schemes it is not the case - but in AFBC it is so.
Where we run into problems is where there are not already fourcc codes
which represent the data which the AFBC encoder/decoder is processing.
To that end, we want to introduce new fourcc codes to describe the
data being encoded/decoded, in the places where none of the existing
fourcc codes are applicable.
Where we don't support an equivalent non-compressed layout, or where
no "obvious" linear layout exists, we are proposing adding fourcc
codes which have no associated linear layout - because any layout we
proposed would be completely arbitrary.
Some formats are following the naming conventions from [2].
The summary of the new formats is:
DRM_FORMAT_VUY888 - Packed 8-bit YUV 444. Y followed by U then V.
DRM_FORMAT_VUY101010 - Packed 10-bit YUV 444. Y followed by U then
V. No defined linear encoding.
DRM_FORMAT_Y210 - Packed 10-bit YUV 422. Y followed by U (then Y)
then V. 10-bit samples in 16-bit words.
DRM_FORMAT_Y410 - Packed 10-bit YUV 444, with 2-bit alpha.
DRM_FORMAT_P210 - Semi-planar 10-bit YUV 422. Y plane, followed by
interleaved U-then-V plane. 10-bit samples in
16-bit words.
DRM_FORMAT_YUV420_8BIT - Packed 8-bit YUV 420. Y followed by U then
V. No defined linear encoding
DRM_FORMAT_YUV420_10BIT - Packed 10-bit YUV 420. Y followed by U
then V. No defined linear encoding
Please also note that in the absence of AFBC, we would still need to
add Y410, Y210 and P210.
Full rationale follows:
YUV 444 8-bit, 1-plane
----------------------
The currently defined AYUV format encodes a 4th alpha component,
which makes it unsuitable for representing a 3-component YUV 444
AFBC stream.
The proposed[1] XYUV format which is supported by Mali-DP in linear
layout is also unsuitable, because the component order is the
opposite of the AFBC version, and it encodes a 4th 'X' component.
DRM_FORMAT_VUY888 is the "obvious" format for a 3-component, packed,
YUV 444 8-bit format, with the component order which our HW expects to
encode/decode. It conforms to the same naming convention as the
existing packed YUV 444 format.
The naming here is meant to be consistent with DRM_FORMAT_AYUV and
DRM_FORMAT_XYUV[1]
YUV 444 10-bit, 1-plane
-----------------------
There is no currently-defined YUV 444 10-bit format in
drm_fourcc.h, irrespective of number of planes.
The proposed[1] XVYU2101010 format which is supported by Mali-DP in
linear layout uses the wrong component order, and also encodes a 4th
'X' component, which doesn't match the AFBC version of YUV 444
10-bit which we support.
DRM_FORMAT_Y410 is the same layout as XVYU2101010, but with 2 bits of
alpha. This format is supported with linear layout by Mali GPUs. The
naming follows[2].
There is no "obvious" linear encoding for a 3-component 10:10:10
packed format, and so DRM_FORMAT_VUY101010 defines a component
order, but not a bit encoding. Again, the naming is meant to be
consistent with DRM_FORMAT_AYUV.
YUV 422 8-bit, 1-plane
----------------------
The existing DRM_FORMAT_YUYV (and the other component orders) are
single-planar YUV 422 8-bit formats. Following the convention of
the component orders of the RGB formats, YUYV has the correct
component order for our AFBC encoding (Y followed by U followed by
V). We can use YUYV for AFBC YUV 422 8-bit.
YUV 422 10-bit, 1-plane
-----------------------
There is no currently-defined YUV 422 10-bit format in drm_fourcc.h
DRM_FORMAT_Y210 is analogous to YUYV, but with 10-bits per sample
packed into the upper 10-bits of 16-bit samples. This format is
supported in both linear and AFBC by Mali GPUs.
YUV 422 10-bit, 2-plane
-----------------------
The recently defined DRM_FORMAT_P010 format is a 10-bit semi-planar
YUV 420 format, which has the correct component ordering for an AFBC
2-plane YUV 420 buffer. The linear layout contains meaningless padding
bits, which will not be encoded in an AFBC stream.
YUV 420 8-bit, 1-plane
----------------------
There is no currently defined single-planar YUV 420, 8-bit format
in drm_fourcc.h. There's differing opinions on whether using the
existing fourcc-implied n_planes where possible is a good idea or
not when using modifiers.
For me, it's much more "obvious" to use NV12 for 2-plane AFBC and
YUV420 for 3-plane AFBC. This keeps the aforementioned separation
between the AFBC codec settings (in the modifier) and the pixel data
format (in the fourcc). With different vendors using AFBC, this helps
to ensure that there is no confusion in interoperation. It also
ensures that the AFBC modifiers describe AFBC itself (which is a
licensable component), and not implementation details which are not
defined by AFBC.
The proposed[1] X0L0 format which Mali-DP supports with Linear layout
is unsuitable, as it contains a 4th 'X' component, and our AFBC
decoder expects only 3 components.
To that end, we propose a new YUV 420 8-bit format. There is no
"obvious" linear encoding for a 3-component 8:8:8, 420, packed format,
and so DRM_FORMAT_YUV420_8BIT defines a component order, but not a
bit encoding. I'm happy to hear different naming suggestions.
YUV 420 8-bit, 2-, 3-plane
--------------------------
These already exist, we can use NV12 and YUV420.
YUV 420 10-bit, 1-plane
-----------------------
As above, no current definition exists, and X0L2 encodes a 4th 'X'
channel.
Analogous to DRM_FORMAT_YUV420_8BIT, we define DRM_FORMAT_YUV420_10BIT.
[1] https://lists.freedesktop.org/archives/dri-devel/2018-July/184598.html
[2] https://docs.microsoft.com/en-us/windows/desktop/medfound/10-bit-and-16-bit-yuv-video-formats
Changes since RFC v1:
- Fix confusing subsampling vs bit-depth X:X:X notation in
descriptions (danvet)
- Rename DRM_FORMAT_AVYU1101010 to DRM_FORMAT_Y410 (Lisa Wu)
- Add drm_format_info structures for the new formats, using the
new 'bpp' field for those with non-integer bytes-per-pixel
- Rebase, including Juha-Pekka Heikkila's format definitions
Changes since RFC v2:
- Rebase on top of latest changes in drm-misc-next
- Change the description of DRM_FORMAT_P210 in __drm_format_info and
drm_fourcc.h so as to make it consistent with other DRM_FORMAT_PXXX
formats.
Changes since v3:
- Added the ack
- Rebased on the latest drm-misc-next
Signed-off-by: Brian Starkey <brian.starkey@arm.com>
Signed-off-by: Ayan Kumar Halder <ayan.halder@arm.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Link: https://patchwork.freedesktop.org/patch/291759/?series=57895&rev=1
2018-10-05 17:27:00 +08:00
|
|
|
#define DRM_FORMAT_VUY888 fourcc_code('V', 'U', '2', '4') /* [23:0] Cr:Cb:Y 8:8:8 little endian */
|
|
|
|
#define DRM_FORMAT_VUY101010 fourcc_code('V', 'U', '3', '0') /* Y followed by U then V, 10:10:10. Non-linear modifier only */
|
2011-11-18 00:05:13 +08:00
|
|
|
|
2019-03-04 19:56:33 +08:00
|
|
|
/*
|
|
|
|
* packed Y2xx indicate for each component, xx valid data occupy msb
|
|
|
|
* 16-xx padding occupy lsb
|
|
|
|
*/
|
2019-03-19 20:17:02 +08:00
|
|
|
#define DRM_FORMAT_Y210 fourcc_code('Y', '2', '1', '0') /* [63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 10:6:10:6:10:6:10:6 little endian per 2 Y pixels */
|
|
|
|
#define DRM_FORMAT_Y212 fourcc_code('Y', '2', '1', '2') /* [63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 12:4:12:4:12:4:12:4 little endian per 2 Y pixels */
|
|
|
|
#define DRM_FORMAT_Y216 fourcc_code('Y', '2', '1', '6') /* [63:0] Cr0:Y1:Cb0:Y0 16:16:16:16 little endian per 2 Y pixels */
|
2019-03-04 19:56:33 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* packed Y4xx indicate for each component, xx valid data occupy msb
|
|
|
|
* 16-xx padding occupy lsb except Y410
|
|
|
|
*/
|
2019-03-19 20:17:02 +08:00
|
|
|
#define DRM_FORMAT_Y410 fourcc_code('Y', '4', '1', '0') /* [31:0] A:Cr:Y:Cb 2:10:10:10 little endian */
|
|
|
|
#define DRM_FORMAT_Y412 fourcc_code('Y', '4', '1', '2') /* [63:0] A:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian */
|
|
|
|
#define DRM_FORMAT_Y416 fourcc_code('Y', '4', '1', '6') /* [63:0] A:Cr:Y:Cb 16:16:16:16 little endian */
|
|
|
|
|
|
|
|
#define DRM_FORMAT_XVYU2101010 fourcc_code('X', 'V', '3', '0') /* [31:0] X:Cr:Y:Cb 2:10:10:10 little endian */
|
|
|
|
#define DRM_FORMAT_XVYU12_16161616 fourcc_code('X', 'V', '3', '6') /* [63:0] X:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian */
|
|
|
|
#define DRM_FORMAT_XVYU16161616 fourcc_code('X', 'V', '4', '8') /* [63:0] X:Cr:Y:Cb 16:16:16:16 little endian */
|
2019-03-04 19:56:33 +08:00
|
|
|
|
2018-11-01 23:11:30 +08:00
|
|
|
/*
|
|
|
|
* packed YCbCr420 2x2 tiled formats
|
|
|
|
* first 64 bits will contain Y,Cb,Cr components for a 2x2 tile
|
|
|
|
*/
|
|
|
|
/* [63:0] A3:A2:Y3:0:Cr0:0:Y2:0:A1:A0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian */
|
|
|
|
#define DRM_FORMAT_Y0L0 fourcc_code('Y', '0', 'L', '0')
|
|
|
|
/* [63:0] X3:X2:Y3:0:Cr0:0:Y2:0:X1:X0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian */
|
|
|
|
#define DRM_FORMAT_X0L0 fourcc_code('X', '0', 'L', '0')
|
|
|
|
|
|
|
|
/* [63:0] A3:A2:Y3:Cr0:Y2:A1:A0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian */
|
|
|
|
#define DRM_FORMAT_Y0L2 fourcc_code('Y', '0', 'L', '2')
|
|
|
|
/* [63:0] X3:X2:Y3:Cr0:Y2:X1:X0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian */
|
|
|
|
#define DRM_FORMAT_X0L2 fourcc_code('X', '0', 'L', '2')
|
|
|
|
|
drm/fourcc: Add AFBC yuv fourccs for Mali
As we look to enable AFBC using DRM format modifiers, we run into
problems which we've historically handled via vendor-private details
(i.e. gralloc, on Android).
AFBC (as an encoding) is fully flexible, and for example YUV data can
be encoded into 1, 2 or 3 encoded "planes", much like the linear
equivalents. Component order is also meaningful, as AFBC doesn't
necessarily care about what each "channel" of the data it encodes
contains. Therefore ABGR8888 and RGBA8888 can be encoded in AFBC with
different representations. Similarly, 'X' components may be encoded
into AFBC streams in cases where a decoder expects to decode a 4th
component.
In addition, AFBC is a licensable IP, meaning that to support the
ecosystem we need to ensure that _all_ AFBC users are able to describe
the encodings that they need. This is much better achieved by
preserving meaning in the fourcc codes when they are combined with an
AFBC modifier.
In essence, we want to use the modifier to describe the parameters of
the AFBC encode/decode, and use the fourcc code to describe the data
being encoded/decoded.
To do anything different would be to introduce redundancy - we would
need to duplicate in the modifier information which is _already_
conveyed clearly and non-ambigiously by a fourcc code.
I hope that for RGB this is non-controversial.
(BGRA8888 + MODIFIER_AFBC) is a different format from
(RGBA8888 + MODIFIER_AFBC).
Possibly more controversial is that (XBGR8888 + MODIFIER_AFBC)
is different from (BGR888 + MODIFIER_AFBC). I understand that in some
schemes it is not the case - but in AFBC it is so.
Where we run into problems is where there are not already fourcc codes
which represent the data which the AFBC encoder/decoder is processing.
To that end, we want to introduce new fourcc codes to describe the
data being encoded/decoded, in the places where none of the existing
fourcc codes are applicable.
Where we don't support an equivalent non-compressed layout, or where
no "obvious" linear layout exists, we are proposing adding fourcc
codes which have no associated linear layout - because any layout we
proposed would be completely arbitrary.
Some formats are following the naming conventions from [2].
The summary of the new formats is:
DRM_FORMAT_VUY888 - Packed 8-bit YUV 444. Y followed by U then V.
DRM_FORMAT_VUY101010 - Packed 10-bit YUV 444. Y followed by U then
V. No defined linear encoding.
DRM_FORMAT_Y210 - Packed 10-bit YUV 422. Y followed by U (then Y)
then V. 10-bit samples in 16-bit words.
DRM_FORMAT_Y410 - Packed 10-bit YUV 444, with 2-bit alpha.
DRM_FORMAT_P210 - Semi-planar 10-bit YUV 422. Y plane, followed by
interleaved U-then-V plane. 10-bit samples in
16-bit words.
DRM_FORMAT_YUV420_8BIT - Packed 8-bit YUV 420. Y followed by U then
V. No defined linear encoding
DRM_FORMAT_YUV420_10BIT - Packed 10-bit YUV 420. Y followed by U
then V. No defined linear encoding
Please also note that in the absence of AFBC, we would still need to
add Y410, Y210 and P210.
Full rationale follows:
YUV 444 8-bit, 1-plane
----------------------
The currently defined AYUV format encodes a 4th alpha component,
which makes it unsuitable for representing a 3-component YUV 444
AFBC stream.
The proposed[1] XYUV format which is supported by Mali-DP in linear
layout is also unsuitable, because the component order is the
opposite of the AFBC version, and it encodes a 4th 'X' component.
DRM_FORMAT_VUY888 is the "obvious" format for a 3-component, packed,
YUV 444 8-bit format, with the component order which our HW expects to
encode/decode. It conforms to the same naming convention as the
existing packed YUV 444 format.
The naming here is meant to be consistent with DRM_FORMAT_AYUV and
DRM_FORMAT_XYUV[1]
YUV 444 10-bit, 1-plane
-----------------------
There is no currently-defined YUV 444 10-bit format in
drm_fourcc.h, irrespective of number of planes.
The proposed[1] XVYU2101010 format which is supported by Mali-DP in
linear layout uses the wrong component order, and also encodes a 4th
'X' component, which doesn't match the AFBC version of YUV 444
10-bit which we support.
DRM_FORMAT_Y410 is the same layout as XVYU2101010, but with 2 bits of
alpha. This format is supported with linear layout by Mali GPUs. The
naming follows[2].
There is no "obvious" linear encoding for a 3-component 10:10:10
packed format, and so DRM_FORMAT_VUY101010 defines a component
order, but not a bit encoding. Again, the naming is meant to be
consistent with DRM_FORMAT_AYUV.
YUV 422 8-bit, 1-plane
----------------------
The existing DRM_FORMAT_YUYV (and the other component orders) are
single-planar YUV 422 8-bit formats. Following the convention of
the component orders of the RGB formats, YUYV has the correct
component order for our AFBC encoding (Y followed by U followed by
V). We can use YUYV for AFBC YUV 422 8-bit.
YUV 422 10-bit, 1-plane
-----------------------
There is no currently-defined YUV 422 10-bit format in drm_fourcc.h
DRM_FORMAT_Y210 is analogous to YUYV, but with 10-bits per sample
packed into the upper 10-bits of 16-bit samples. This format is
supported in both linear and AFBC by Mali GPUs.
YUV 422 10-bit, 2-plane
-----------------------
The recently defined DRM_FORMAT_P010 format is a 10-bit semi-planar
YUV 420 format, which has the correct component ordering for an AFBC
2-plane YUV 420 buffer. The linear layout contains meaningless padding
bits, which will not be encoded in an AFBC stream.
YUV 420 8-bit, 1-plane
----------------------
There is no currently defined single-planar YUV 420, 8-bit format
in drm_fourcc.h. There's differing opinions on whether using the
existing fourcc-implied n_planes where possible is a good idea or
not when using modifiers.
For me, it's much more "obvious" to use NV12 for 2-plane AFBC and
YUV420 for 3-plane AFBC. This keeps the aforementioned separation
between the AFBC codec settings (in the modifier) and the pixel data
format (in the fourcc). With different vendors using AFBC, this helps
to ensure that there is no confusion in interoperation. It also
ensures that the AFBC modifiers describe AFBC itself (which is a
licensable component), and not implementation details which are not
defined by AFBC.
The proposed[1] X0L0 format which Mali-DP supports with Linear layout
is unsuitable, as it contains a 4th 'X' component, and our AFBC
decoder expects only 3 components.
To that end, we propose a new YUV 420 8-bit format. There is no
"obvious" linear encoding for a 3-component 8:8:8, 420, packed format,
and so DRM_FORMAT_YUV420_8BIT defines a component order, but not a
bit encoding. I'm happy to hear different naming suggestions.
YUV 420 8-bit, 2-, 3-plane
--------------------------
These already exist, we can use NV12 and YUV420.
YUV 420 10-bit, 1-plane
-----------------------
As above, no current definition exists, and X0L2 encodes a 4th 'X'
channel.
Analogous to DRM_FORMAT_YUV420_8BIT, we define DRM_FORMAT_YUV420_10BIT.
[1] https://lists.freedesktop.org/archives/dri-devel/2018-July/184598.html
[2] https://docs.microsoft.com/en-us/windows/desktop/medfound/10-bit-and-16-bit-yuv-video-formats
Changes since RFC v1:
- Fix confusing subsampling vs bit-depth X:X:X notation in
descriptions (danvet)
- Rename DRM_FORMAT_AVYU1101010 to DRM_FORMAT_Y410 (Lisa Wu)
- Add drm_format_info structures for the new formats, using the
new 'bpp' field for those with non-integer bytes-per-pixel
- Rebase, including Juha-Pekka Heikkila's format definitions
Changes since RFC v2:
- Rebase on top of latest changes in drm-misc-next
- Change the description of DRM_FORMAT_P210 in __drm_format_info and
drm_fourcc.h so as to make it consistent with other DRM_FORMAT_PXXX
formats.
Changes since v3:
- Added the ack
- Rebased on the latest drm-misc-next
Signed-off-by: Brian Starkey <brian.starkey@arm.com>
Signed-off-by: Ayan Kumar Halder <ayan.halder@arm.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Link: https://patchwork.freedesktop.org/patch/291759/?series=57895&rev=1
2018-10-05 17:27:00 +08:00
|
|
|
/*
|
|
|
|
* 1-plane YUV 4:2:0
|
|
|
|
* In these formats, the component ordering is specified (Y, followed by U
|
|
|
|
* then V), but the exact Linear layout is undefined.
|
|
|
|
* These formats can only be used with a non-Linear modifier.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_YUV420_8BIT fourcc_code('Y', 'U', '0', '8')
|
|
|
|
#define DRM_FORMAT_YUV420_10BIT fourcc_code('Y', 'U', '1', '0')
|
|
|
|
|
2015-01-09 18:05:13 +08:00
|
|
|
/*
|
|
|
|
* 2 plane RGB + A
|
|
|
|
* index 0 = RGB plane, same format as the corresponding non _A8 format has
|
|
|
|
* index 1 = A plane, [7:0] A
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_XRGB8888_A8 fourcc_code('X', 'R', 'A', '8')
|
|
|
|
#define DRM_FORMAT_XBGR8888_A8 fourcc_code('X', 'B', 'A', '8')
|
|
|
|
#define DRM_FORMAT_RGBX8888_A8 fourcc_code('R', 'X', 'A', '8')
|
|
|
|
#define DRM_FORMAT_BGRX8888_A8 fourcc_code('B', 'X', 'A', '8')
|
|
|
|
#define DRM_FORMAT_RGB888_A8 fourcc_code('R', '8', 'A', '8')
|
|
|
|
#define DRM_FORMAT_BGR888_A8 fourcc_code('B', '8', 'A', '8')
|
|
|
|
#define DRM_FORMAT_RGB565_A8 fourcc_code('R', '5', 'A', '8')
|
|
|
|
#define DRM_FORMAT_BGR565_A8 fourcc_code('B', '5', 'A', '8')
|
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
/*
|
|
|
|
* 2 plane YCbCr
|
|
|
|
* index 0 = Y plane, [7:0] Y
|
|
|
|
* index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian
|
|
|
|
* or
|
|
|
|
* index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_NV12 fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */
|
|
|
|
#define DRM_FORMAT_NV21 fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */
|
|
|
|
#define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */
|
|
|
|
#define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
|
2012-05-19 05:47:40 +08:00
|
|
|
#define DRM_FORMAT_NV24 fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */
|
|
|
|
#define DRM_FORMAT_NV42 fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */
|
2011-11-18 00:05:13 +08:00
|
|
|
|
drm/fourcc: Add AFBC yuv fourccs for Mali
As we look to enable AFBC using DRM format modifiers, we run into
problems which we've historically handled via vendor-private details
(i.e. gralloc, on Android).
AFBC (as an encoding) is fully flexible, and for example YUV data can
be encoded into 1, 2 or 3 encoded "planes", much like the linear
equivalents. Component order is also meaningful, as AFBC doesn't
necessarily care about what each "channel" of the data it encodes
contains. Therefore ABGR8888 and RGBA8888 can be encoded in AFBC with
different representations. Similarly, 'X' components may be encoded
into AFBC streams in cases where a decoder expects to decode a 4th
component.
In addition, AFBC is a licensable IP, meaning that to support the
ecosystem we need to ensure that _all_ AFBC users are able to describe
the encodings that they need. This is much better achieved by
preserving meaning in the fourcc codes when they are combined with an
AFBC modifier.
In essence, we want to use the modifier to describe the parameters of
the AFBC encode/decode, and use the fourcc code to describe the data
being encoded/decoded.
To do anything different would be to introduce redundancy - we would
need to duplicate in the modifier information which is _already_
conveyed clearly and non-ambigiously by a fourcc code.
I hope that for RGB this is non-controversial.
(BGRA8888 + MODIFIER_AFBC) is a different format from
(RGBA8888 + MODIFIER_AFBC).
Possibly more controversial is that (XBGR8888 + MODIFIER_AFBC)
is different from (BGR888 + MODIFIER_AFBC). I understand that in some
schemes it is not the case - but in AFBC it is so.
Where we run into problems is where there are not already fourcc codes
which represent the data which the AFBC encoder/decoder is processing.
To that end, we want to introduce new fourcc codes to describe the
data being encoded/decoded, in the places where none of the existing
fourcc codes are applicable.
Where we don't support an equivalent non-compressed layout, or where
no "obvious" linear layout exists, we are proposing adding fourcc
codes which have no associated linear layout - because any layout we
proposed would be completely arbitrary.
Some formats are following the naming conventions from [2].
The summary of the new formats is:
DRM_FORMAT_VUY888 - Packed 8-bit YUV 444. Y followed by U then V.
DRM_FORMAT_VUY101010 - Packed 10-bit YUV 444. Y followed by U then
V. No defined linear encoding.
DRM_FORMAT_Y210 - Packed 10-bit YUV 422. Y followed by U (then Y)
then V. 10-bit samples in 16-bit words.
DRM_FORMAT_Y410 - Packed 10-bit YUV 444, with 2-bit alpha.
DRM_FORMAT_P210 - Semi-planar 10-bit YUV 422. Y plane, followed by
interleaved U-then-V plane. 10-bit samples in
16-bit words.
DRM_FORMAT_YUV420_8BIT - Packed 8-bit YUV 420. Y followed by U then
V. No defined linear encoding
DRM_FORMAT_YUV420_10BIT - Packed 10-bit YUV 420. Y followed by U
then V. No defined linear encoding
Please also note that in the absence of AFBC, we would still need to
add Y410, Y210 and P210.
Full rationale follows:
YUV 444 8-bit, 1-plane
----------------------
The currently defined AYUV format encodes a 4th alpha component,
which makes it unsuitable for representing a 3-component YUV 444
AFBC stream.
The proposed[1] XYUV format which is supported by Mali-DP in linear
layout is also unsuitable, because the component order is the
opposite of the AFBC version, and it encodes a 4th 'X' component.
DRM_FORMAT_VUY888 is the "obvious" format for a 3-component, packed,
YUV 444 8-bit format, with the component order which our HW expects to
encode/decode. It conforms to the same naming convention as the
existing packed YUV 444 format.
The naming here is meant to be consistent with DRM_FORMAT_AYUV and
DRM_FORMAT_XYUV[1]
YUV 444 10-bit, 1-plane
-----------------------
There is no currently-defined YUV 444 10-bit format in
drm_fourcc.h, irrespective of number of planes.
The proposed[1] XVYU2101010 format which is supported by Mali-DP in
linear layout uses the wrong component order, and also encodes a 4th
'X' component, which doesn't match the AFBC version of YUV 444
10-bit which we support.
DRM_FORMAT_Y410 is the same layout as XVYU2101010, but with 2 bits of
alpha. This format is supported with linear layout by Mali GPUs. The
naming follows[2].
There is no "obvious" linear encoding for a 3-component 10:10:10
packed format, and so DRM_FORMAT_VUY101010 defines a component
order, but not a bit encoding. Again, the naming is meant to be
consistent with DRM_FORMAT_AYUV.
YUV 422 8-bit, 1-plane
----------------------
The existing DRM_FORMAT_YUYV (and the other component orders) are
single-planar YUV 422 8-bit formats. Following the convention of
the component orders of the RGB formats, YUYV has the correct
component order for our AFBC encoding (Y followed by U followed by
V). We can use YUYV for AFBC YUV 422 8-bit.
YUV 422 10-bit, 1-plane
-----------------------
There is no currently-defined YUV 422 10-bit format in drm_fourcc.h
DRM_FORMAT_Y210 is analogous to YUYV, but with 10-bits per sample
packed into the upper 10-bits of 16-bit samples. This format is
supported in both linear and AFBC by Mali GPUs.
YUV 422 10-bit, 2-plane
-----------------------
The recently defined DRM_FORMAT_P010 format is a 10-bit semi-planar
YUV 420 format, which has the correct component ordering for an AFBC
2-plane YUV 420 buffer. The linear layout contains meaningless padding
bits, which will not be encoded in an AFBC stream.
YUV 420 8-bit, 1-plane
----------------------
There is no currently defined single-planar YUV 420, 8-bit format
in drm_fourcc.h. There's differing opinions on whether using the
existing fourcc-implied n_planes where possible is a good idea or
not when using modifiers.
For me, it's much more "obvious" to use NV12 for 2-plane AFBC and
YUV420 for 3-plane AFBC. This keeps the aforementioned separation
between the AFBC codec settings (in the modifier) and the pixel data
format (in the fourcc). With different vendors using AFBC, this helps
to ensure that there is no confusion in interoperation. It also
ensures that the AFBC modifiers describe AFBC itself (which is a
licensable component), and not implementation details which are not
defined by AFBC.
The proposed[1] X0L0 format which Mali-DP supports with Linear layout
is unsuitable, as it contains a 4th 'X' component, and our AFBC
decoder expects only 3 components.
To that end, we propose a new YUV 420 8-bit format. There is no
"obvious" linear encoding for a 3-component 8:8:8, 420, packed format,
and so DRM_FORMAT_YUV420_8BIT defines a component order, but not a
bit encoding. I'm happy to hear different naming suggestions.
YUV 420 8-bit, 2-, 3-plane
--------------------------
These already exist, we can use NV12 and YUV420.
YUV 420 10-bit, 1-plane
-----------------------
As above, no current definition exists, and X0L2 encodes a 4th 'X'
channel.
Analogous to DRM_FORMAT_YUV420_8BIT, we define DRM_FORMAT_YUV420_10BIT.
[1] https://lists.freedesktop.org/archives/dri-devel/2018-July/184598.html
[2] https://docs.microsoft.com/en-us/windows/desktop/medfound/10-bit-and-16-bit-yuv-video-formats
Changes since RFC v1:
- Fix confusing subsampling vs bit-depth X:X:X notation in
descriptions (danvet)
- Rename DRM_FORMAT_AVYU1101010 to DRM_FORMAT_Y410 (Lisa Wu)
- Add drm_format_info structures for the new formats, using the
new 'bpp' field for those with non-integer bytes-per-pixel
- Rebase, including Juha-Pekka Heikkila's format definitions
Changes since RFC v2:
- Rebase on top of latest changes in drm-misc-next
- Change the description of DRM_FORMAT_P210 in __drm_format_info and
drm_fourcc.h so as to make it consistent with other DRM_FORMAT_PXXX
formats.
Changes since v3:
- Added the ack
- Rebased on the latest drm-misc-next
Signed-off-by: Brian Starkey <brian.starkey@arm.com>
Signed-off-by: Ayan Kumar Halder <ayan.halder@arm.com>
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Link: https://patchwork.freedesktop.org/patch/291759/?series=57895&rev=1
2018-10-05 17:27:00 +08:00
|
|
|
/*
|
|
|
|
* 2 plane YCbCr MSB aligned
|
|
|
|
* index 0 = Y plane, [15:0] Y:x [10:6] little endian
|
|
|
|
* index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [10:6:10:6] little endian
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_P210 fourcc_code('P', '2', '1', '0') /* 2x1 subsampled Cr:Cb plane, 10 bit per channel */
|
|
|
|
|
2019-01-10 03:57:09 +08:00
|
|
|
/*
|
|
|
|
* 2 plane YCbCr MSB aligned
|
|
|
|
* index 0 = Y plane, [15:0] Y:x [10:6] little endian
|
|
|
|
* index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [10:6:10:6] little endian
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_P010 fourcc_code('P', '0', '1', '0') /* 2x2 subsampled Cr:Cb plane 10 bits per channel */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 2 plane YCbCr MSB aligned
|
|
|
|
* index 0 = Y plane, [15:0] Y:x [12:4] little endian
|
|
|
|
* index 1 = Cr:Cb plane, [31:0] Cr:x:Cb:x [12:4:12:4] little endian
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_P012 fourcc_code('P', '0', '1', '2') /* 2x2 subsampled Cr:Cb plane 12 bits per channel */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 2 plane YCbCr MSB aligned
|
|
|
|
* index 0 = Y plane, [15:0] Y little endian
|
|
|
|
* index 1 = Cr:Cb plane, [31:0] Cr:Cb [16:16] little endian
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_P016 fourcc_code('P', '0', '1', '6') /* 2x2 subsampled Cr:Cb plane 16 bits per channel */
|
|
|
|
|
2011-11-18 00:05:13 +08:00
|
|
|
/*
|
|
|
|
* 3 plane YCbCr
|
|
|
|
* index 0: Y plane, [7:0] Y
|
|
|
|
* index 1: Cb plane, [7:0] Cb
|
|
|
|
* index 2: Cr plane, [7:0] Cr
|
|
|
|
* or
|
|
|
|
* index 1: Cr plane, [7:0] Cr
|
|
|
|
* index 2: Cb plane, [7:0] Cb
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_YUV410 fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */
|
|
|
|
#define DRM_FORMAT_YVU410 fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */
|
|
|
|
#define DRM_FORMAT_YUV411 fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */
|
|
|
|
#define DRM_FORMAT_YVU411 fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */
|
|
|
|
#define DRM_FORMAT_YUV420 fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */
|
|
|
|
#define DRM_FORMAT_YVU420 fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */
|
|
|
|
#define DRM_FORMAT_YUV422 fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */
|
|
|
|
#define DRM_FORMAT_YVU422 fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */
|
|
|
|
#define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
|
|
|
|
#define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
|
2011-11-15 06:51:28 +08:00
|
|
|
|
2015-02-05 22:41:52 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Format Modifiers:
|
|
|
|
*
|
|
|
|
* Format modifiers describe, typically, a re-ordering or modification
|
|
|
|
* of the data in a plane of an FB. This can be used to express tiled/
|
|
|
|
* swizzled formats, or compression, or a combination of the two.
|
|
|
|
*
|
|
|
|
* The upper 8 bits of the format modifier are a vendor-id as assigned
|
|
|
|
* below. The lower 56 bits are assigned as vendor sees fit.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Vendor Ids: */
|
|
|
|
#define DRM_FORMAT_MOD_NONE 0
|
2016-12-14 03:27:52 +08:00
|
|
|
#define DRM_FORMAT_MOD_VENDOR_NONE 0
|
2015-02-05 22:41:52 +08:00
|
|
|
#define DRM_FORMAT_MOD_VENDOR_INTEL 0x01
|
|
|
|
#define DRM_FORMAT_MOD_VENDOR_AMD 0x02
|
drm/tegra: Sanitize format modifiers
The existing format modifier definitions were merged prematurely, and
recent work has unveiled that the definitions are suboptimal in several
ways:
- The format specifiers, except for one, are not Tegra specific, but
the names don't reflect that.
- The number space is split into two, reserving 32 bits for some
"parameter" which most of the modifiers are not going to have.
- Symbolic names for the modifiers are not using the standard
DRM_FORMAT_MOD_* prefix, which makes them awkward to use.
- The vendor prefix NV is somewhat ambiguous.
Fortunately, nobody's started using these modifiers, so we can still fix
the above issues. Do so by using the standard prefix. Also, remove TEGRA
from the name of those modifiers that exist on NVIDIA GPUs as well. In
case of the block linear modifiers, make the "parameter" smaller (4
bits, though only 6 values are valid) and don't let that leak into any
of the other modifiers.
Finally, also use the more canonical NVIDIA instead of the ambiguous NV
prefix.
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Thierry Reding <treding@nvidia.com>
2017-10-12 22:39:20 +08:00
|
|
|
#define DRM_FORMAT_MOD_VENDOR_NVIDIA 0x03
|
2015-02-05 22:41:52 +08:00
|
|
|
#define DRM_FORMAT_MOD_VENDOR_SAMSUNG 0x04
|
|
|
|
#define DRM_FORMAT_MOD_VENDOR_QCOM 0x05
|
2017-01-26 23:32:17 +08:00
|
|
|
#define DRM_FORMAT_MOD_VENDOR_VIVANTE 0x06
|
drm/vc4: Add T-format scanout support.
The T tiling format is what V3D uses for textures, with no raster
support at all until later revisions of the hardware (and always at a
large 3D performance penalty). If we can't scan out V3D's format,
then we often need to do a relayout at some stage of the pipeline,
either right before texturing from the scanout buffer (common in X11
without a compositor) or between a tiled screen buffer right before
scanout (an option I've considered in trying to resolve this
inconsistency, but which means needing to use the dirty fb ioctl and
having some update policy).
T-format scanout lets us avoid either of those shadow copies, for a
massive, obvious performance improvement to X11 window dragging
without a compositor. Unfortunately, enabling a compositor to work
around the discrepancy has turned out to be too costly in memory
consumption for the Raspbian distribution.
Because the HVS operates a scanline at a time, compositing from T does
increase the memory bandwidth cost of scanout. On my 1920x1080@32bpp
display on a RPi3, we go from about 15% of system memory bandwidth
with linear to about 20% with tiled. However, for X11 this still ends
up being a huge performance win in active usage.
This patch doesn't yet handle src_x/src_y offsetting within the tiled
buffer. However, we fail to do so for untiled buffers already.
Signed-off-by: Eric Anholt <eric@anholt.net>
Link: http://patchwork.freedesktop.org/patch/msgid/20170608001336.12842-1-eric@anholt.net
Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
2017-06-08 08:13:35 +08:00
|
|
|
#define DRM_FORMAT_MOD_VENDOR_BROADCOM 0x07
|
2018-07-10 21:18:54 +08:00
|
|
|
#define DRM_FORMAT_MOD_VENDOR_ARM 0x08
|
2019-01-18 22:51:21 +08:00
|
|
|
#define DRM_FORMAT_MOD_VENDOR_ALLWINNER 0x09
|
|
|
|
|
2015-02-05 22:41:52 +08:00
|
|
|
/* add more to the end as needed */
|
|
|
|
|
2017-07-24 11:46:38 +08:00
|
|
|
#define DRM_FORMAT_RESERVED ((1ULL << 56) - 1)
|
|
|
|
|
2015-02-05 22:41:52 +08:00
|
|
|
#define fourcc_mod_code(vendor, val) \
|
2017-11-01 22:20:04 +08:00
|
|
|
((((__u64)DRM_FORMAT_MOD_VENDOR_## vendor) << 56) | ((val) & 0x00ffffffffffffffULL))
|
2015-02-05 22:41:52 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Format Modifier tokens:
|
|
|
|
*
|
|
|
|
* When adding a new token please document the layout with a code comment,
|
|
|
|
* similar to the fourcc codes above. drm_fourcc.h is considered the
|
|
|
|
* authoritative source for all of these.
|
|
|
|
*/
|
|
|
|
|
2017-07-24 11:46:38 +08:00
|
|
|
/*
|
|
|
|
* Invalid Modifier
|
|
|
|
*
|
|
|
|
* This modifier can be used as a sentinel to terminate the format modifiers
|
|
|
|
* list, or to initialize a variable with an invalid modifier. It might also be
|
|
|
|
* used to report an error back to userspace for certain APIs.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_INVALID fourcc_mod_code(NONE, DRM_FORMAT_RESERVED)
|
|
|
|
|
2016-11-09 20:36:36 +08:00
|
|
|
/*
|
|
|
|
* Linear Layout
|
|
|
|
*
|
|
|
|
* Just plain linear layout. Note that this is different from no specifying any
|
|
|
|
* modifier (e.g. not setting DRM_MODE_FB_MODIFIERS in the DRM_ADDFB2 ioctl),
|
|
|
|
* which tells the driver to also take driver-internal information into account
|
|
|
|
* and so might actually result in a tiled framebuffer.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_LINEAR fourcc_mod_code(NONE, 0)
|
|
|
|
|
2015-02-11 01:16:05 +08:00
|
|
|
/* Intel framebuffer modifiers */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Intel X-tiling layout
|
|
|
|
*
|
|
|
|
* This is a tiled layout using 4Kb tiles (except on gen2 where the tiles 2Kb)
|
|
|
|
* in row-major layout. Within the tile bytes are laid out row-major, with
|
|
|
|
* a platform-dependent stride. On top of that the memory can apply
|
|
|
|
* platform-depending swizzling of some higher address bits into bit6.
|
|
|
|
*
|
|
|
|
* This format is highly platforms specific and not useful for cross-driver
|
|
|
|
* sharing. It exists since on a given platform it does uniquely identify the
|
|
|
|
* layout in a simple way for i915-specific userspace.
|
|
|
|
*/
|
|
|
|
#define I915_FORMAT_MOD_X_TILED fourcc_mod_code(INTEL, 1)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Intel Y-tiling layout
|
|
|
|
*
|
|
|
|
* This is a tiled layout using 4Kb tiles (except on gen2 where the tiles 2Kb)
|
|
|
|
* in row-major layout. Within the tile bytes are laid out in OWORD (16 bytes)
|
|
|
|
* chunks column-major, with a platform-dependent height. On top of that the
|
|
|
|
* memory can apply platform-depending swizzling of some higher address bits
|
|
|
|
* into bit6.
|
|
|
|
*
|
|
|
|
* This format is highly platforms specific and not useful for cross-driver
|
|
|
|
* sharing. It exists since on a given platform it does uniquely identify the
|
|
|
|
* layout in a simple way for i915-specific userspace.
|
|
|
|
*/
|
|
|
|
#define I915_FORMAT_MOD_Y_TILED fourcc_mod_code(INTEL, 2)
|
|
|
|
|
2015-02-27 19:15:17 +08:00
|
|
|
/*
|
|
|
|
* Intel Yf-tiling layout
|
|
|
|
*
|
|
|
|
* This is a tiled layout using 4Kb tiles in row-major layout.
|
|
|
|
* Within the tile pixels are laid out in 16 256 byte units / sub-tiles which
|
|
|
|
* are arranged in four groups (two wide, two high) with column-major layout.
|
|
|
|
* Each group therefore consits out of four 256 byte units, which are also laid
|
|
|
|
* out as 2x2 column-major.
|
|
|
|
* 256 byte units are made out of four 64 byte blocks of pixels, producing
|
|
|
|
* either a square block or a 2:1 unit.
|
|
|
|
* 64 byte blocks of pixels contain four pixel rows of 16 bytes, where the width
|
|
|
|
* in pixel depends on the pixel depth.
|
|
|
|
*/
|
|
|
|
#define I915_FORMAT_MOD_Yf_TILED fourcc_mod_code(INTEL, 3)
|
|
|
|
|
2017-08-02 00:58:12 +08:00
|
|
|
/*
|
|
|
|
* Intel color control surface (CCS) for render compression
|
|
|
|
*
|
|
|
|
* The framebuffer format must be one of the 8:8:8:8 RGB formats.
|
|
|
|
* The main surface will be plane index 0 and must be Y/Yf-tiled,
|
|
|
|
* the CCS will be plane index 1.
|
|
|
|
*
|
|
|
|
* Each CCS tile matches a 1024x512 pixel area of the main surface.
|
|
|
|
* To match certain aspects of the 3D hardware the CCS is
|
|
|
|
* considered to be made up of normal 128Bx32 Y tiles, Thus
|
|
|
|
* the CCS pitch must be specified in multiples of 128 bytes.
|
|
|
|
*
|
|
|
|
* In reality the CCS tile appears to be a 64Bx64 Y tile, composed
|
|
|
|
* of QWORD (8 bytes) chunks instead of OWORD (16 bytes) chunks.
|
|
|
|
* But that fact is not relevant unless the memory is accessed
|
|
|
|
* directly.
|
|
|
|
*/
|
|
|
|
#define I915_FORMAT_MOD_Y_TILED_CCS fourcc_mod_code(INTEL, 4)
|
|
|
|
#define I915_FORMAT_MOD_Yf_TILED_CCS fourcc_mod_code(INTEL, 5)
|
|
|
|
|
2015-01-30 22:48:11 +08:00
|
|
|
/*
|
|
|
|
* Tiled, NV12MT, grouped in 64 (pixels) x 32 (lines) -sized macroblocks
|
|
|
|
*
|
|
|
|
* Macroblocks are laid in a Z-shape, and each pixel data is following the
|
|
|
|
* standard NV12 style.
|
|
|
|
* As for NV12, an image is the result of two frame buffers: one for Y,
|
|
|
|
* one for the interleaved Cb/Cr components (1/2 the height of the Y buffer).
|
|
|
|
* Alignment requirements are (for each buffer):
|
|
|
|
* - multiple of 128 pixels for the width
|
|
|
|
* - multiple of 32 pixels for the height
|
|
|
|
*
|
2015-12-04 20:36:22 +08:00
|
|
|
* For more information: see https://linuxtv.org/downloads/v4l-dvb-apis/re32.html
|
2015-01-30 22:48:11 +08:00
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_SAMSUNG_64_32_TILE fourcc_mod_code(SAMSUNG, 1)
|
|
|
|
|
2018-08-10 21:28:59 +08:00
|
|
|
/*
|
|
|
|
* Tiled, 16 (pixels) x 16 (lines) - sized macroblocks
|
|
|
|
*
|
|
|
|
* This is a simple tiled layout using tiles of 16x16 pixels in a row-major
|
|
|
|
* layout. For YCbCr formats Cb/Cr components are taken in such a way that
|
|
|
|
* they correspond to their 16x16 luma block.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_SAMSUNG_16_16_TILE fourcc_mod_code(SAMSUNG, 2)
|
|
|
|
|
2018-06-06 10:00:54 +08:00
|
|
|
/*
|
|
|
|
* Qualcomm Compressed Format
|
|
|
|
*
|
|
|
|
* Refers to a compressed variant of the base format that is compressed.
|
|
|
|
* Implementation may be platform and base-format specific.
|
|
|
|
*
|
|
|
|
* Each macrotile consists of m x n (mostly 4 x 4) tiles.
|
|
|
|
* Pixel data pitch/stride is aligned with macrotile width.
|
|
|
|
* Pixel data height is aligned with macrotile height.
|
|
|
|
* Entire pixel data buffer is aligned with 4k(bytes).
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_QCOM_COMPRESSED fourcc_mod_code(QCOM, 1)
|
|
|
|
|
2017-01-26 23:32:17 +08:00
|
|
|
/* Vivante framebuffer modifiers */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Vivante 4x4 tiling layout
|
|
|
|
*
|
|
|
|
* This is a simple tiled layout using tiles of 4x4 pixels in a row-major
|
|
|
|
* layout.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_VIVANTE_TILED fourcc_mod_code(VIVANTE, 1)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Vivante 64x64 super-tiling layout
|
|
|
|
*
|
|
|
|
* This is a tiled layout using 64x64 pixel super-tiles, where each super-tile
|
|
|
|
* contains 8x4 groups of 2x4 tiles of 4x4 pixels (like above) each, all in row-
|
|
|
|
* major layout.
|
|
|
|
*
|
|
|
|
* For more information: see
|
|
|
|
* https://github.com/etnaviv/etna_viv/blob/master/doc/hardware.md#texture-tiling
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_VIVANTE_SUPER_TILED fourcc_mod_code(VIVANTE, 2)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Vivante 4x4 tiling layout for dual-pipe
|
|
|
|
*
|
|
|
|
* Same as the 4x4 tiling layout, except every second 4x4 pixel tile starts at a
|
|
|
|
* different base address. Offsets from the base addresses are therefore halved
|
|
|
|
* compared to the non-split tiled layout.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED fourcc_mod_code(VIVANTE, 3)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Vivante 64x64 super-tiling layout for dual-pipe
|
|
|
|
*
|
|
|
|
* Same as the 64x64 super-tiling layout, except every second 4x4 pixel tile
|
|
|
|
* starts at a different base address. Offsets from the base addresses are
|
|
|
|
* therefore halved compared to the non-split super-tiled layout.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED fourcc_mod_code(VIVANTE, 4)
|
|
|
|
|
drm/tegra: Sanitize format modifiers
The existing format modifier definitions were merged prematurely, and
recent work has unveiled that the definitions are suboptimal in several
ways:
- The format specifiers, except for one, are not Tegra specific, but
the names don't reflect that.
- The number space is split into two, reserving 32 bits for some
"parameter" which most of the modifiers are not going to have.
- Symbolic names for the modifiers are not using the standard
DRM_FORMAT_MOD_* prefix, which makes them awkward to use.
- The vendor prefix NV is somewhat ambiguous.
Fortunately, nobody's started using these modifiers, so we can still fix
the above issues. Do so by using the standard prefix. Also, remove TEGRA
from the name of those modifiers that exist on NVIDIA GPUs as well. In
case of the block linear modifiers, make the "parameter" smaller (4
bits, though only 6 values are valid) and don't let that leak into any
of the other modifiers.
Finally, also use the more canonical NVIDIA instead of the ambiguous NV
prefix.
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Thierry Reding <treding@nvidia.com>
2017-10-12 22:39:20 +08:00
|
|
|
/* NVIDIA frame buffer modifiers */
|
2016-11-08 15:50:42 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Tegra Tiled Layout, used by Tegra 2, 3 and 4.
|
|
|
|
*
|
|
|
|
* Pixels are arranged in simple tiles of 16 x 16 bytes.
|
|
|
|
*/
|
drm/tegra: Sanitize format modifiers
The existing format modifier definitions were merged prematurely, and
recent work has unveiled that the definitions are suboptimal in several
ways:
- The format specifiers, except for one, are not Tegra specific, but
the names don't reflect that.
- The number space is split into two, reserving 32 bits for some
"parameter" which most of the modifiers are not going to have.
- Symbolic names for the modifiers are not using the standard
DRM_FORMAT_MOD_* prefix, which makes them awkward to use.
- The vendor prefix NV is somewhat ambiguous.
Fortunately, nobody's started using these modifiers, so we can still fix
the above issues. Do so by using the standard prefix. Also, remove TEGRA
from the name of those modifiers that exist on NVIDIA GPUs as well. In
case of the block linear modifiers, make the "parameter" smaller (4
bits, though only 6 values are valid) and don't let that leak into any
of the other modifiers.
Finally, also use the more canonical NVIDIA instead of the ambiguous NV
prefix.
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Thierry Reding <treding@nvidia.com>
2017-10-12 22:39:20 +08:00
|
|
|
#define DRM_FORMAT_MOD_NVIDIA_TEGRA_TILED fourcc_mod_code(NVIDIA, 1)
|
2016-11-08 15:50:42 +08:00
|
|
|
|
|
|
|
/*
|
drm/tegra: Sanitize format modifiers
The existing format modifier definitions were merged prematurely, and
recent work has unveiled that the definitions are suboptimal in several
ways:
- The format specifiers, except for one, are not Tegra specific, but
the names don't reflect that.
- The number space is split into two, reserving 32 bits for some
"parameter" which most of the modifiers are not going to have.
- Symbolic names for the modifiers are not using the standard
DRM_FORMAT_MOD_* prefix, which makes them awkward to use.
- The vendor prefix NV is somewhat ambiguous.
Fortunately, nobody's started using these modifiers, so we can still fix
the above issues. Do so by using the standard prefix. Also, remove TEGRA
from the name of those modifiers that exist on NVIDIA GPUs as well. In
case of the block linear modifiers, make the "parameter" smaller (4
bits, though only 6 values are valid) and don't let that leak into any
of the other modifiers.
Finally, also use the more canonical NVIDIA instead of the ambiguous NV
prefix.
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Thierry Reding <treding@nvidia.com>
2017-10-12 22:39:20 +08:00
|
|
|
* 16Bx2 Block Linear layout, used by desktop GPUs, and Tegra K1 and later
|
2016-11-08 15:50:42 +08:00
|
|
|
*
|
|
|
|
* Pixels are arranged in 64x8 Groups Of Bytes (GOBs). GOBs are then stacked
|
|
|
|
* vertically by a power of 2 (1 to 32 GOBs) to form a block.
|
|
|
|
*
|
|
|
|
* Within a GOB, data is ordered as 16B x 2 lines sectors laid in Z-shape.
|
|
|
|
*
|
|
|
|
* Parameter 'v' is the log2 encoding of the number of GOBs stacked vertically.
|
|
|
|
* Valid values are:
|
|
|
|
*
|
|
|
|
* 0 == ONE_GOB
|
|
|
|
* 1 == TWO_GOBS
|
|
|
|
* 2 == FOUR_GOBS
|
|
|
|
* 3 == EIGHT_GOBS
|
|
|
|
* 4 == SIXTEEN_GOBS
|
|
|
|
* 5 == THIRTYTWO_GOBS
|
|
|
|
*
|
|
|
|
* Chapter 20 "Pixel Memory Formats" of the Tegra X1 TRM describes this format
|
|
|
|
* in full detail.
|
|
|
|
*/
|
drm/tegra: Sanitize format modifiers
The existing format modifier definitions were merged prematurely, and
recent work has unveiled that the definitions are suboptimal in several
ways:
- The format specifiers, except for one, are not Tegra specific, but
the names don't reflect that.
- The number space is split into two, reserving 32 bits for some
"parameter" which most of the modifiers are not going to have.
- Symbolic names for the modifiers are not using the standard
DRM_FORMAT_MOD_* prefix, which makes them awkward to use.
- The vendor prefix NV is somewhat ambiguous.
Fortunately, nobody's started using these modifiers, so we can still fix
the above issues. Do so by using the standard prefix. Also, remove TEGRA
from the name of those modifiers that exist on NVIDIA GPUs as well. In
case of the block linear modifiers, make the "parameter" smaller (4
bits, though only 6 values are valid) and don't let that leak into any
of the other modifiers.
Finally, also use the more canonical NVIDIA instead of the ambiguous NV
prefix.
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Thierry Reding <treding@nvidia.com>
2017-10-12 22:39:20 +08:00
|
|
|
#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK(v) \
|
|
|
|
fourcc_mod_code(NVIDIA, 0x10 | ((v) & 0xf))
|
|
|
|
|
|
|
|
#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_ONE_GOB \
|
|
|
|
fourcc_mod_code(NVIDIA, 0x10)
|
|
|
|
#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_TWO_GOB \
|
|
|
|
fourcc_mod_code(NVIDIA, 0x11)
|
|
|
|
#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_FOUR_GOB \
|
|
|
|
fourcc_mod_code(NVIDIA, 0x12)
|
|
|
|
#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_EIGHT_GOB \
|
|
|
|
fourcc_mod_code(NVIDIA, 0x13)
|
|
|
|
#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_SIXTEEN_GOB \
|
|
|
|
fourcc_mod_code(NVIDIA, 0x14)
|
|
|
|
#define DRM_FORMAT_MOD_NVIDIA_16BX2_BLOCK_THIRTYTWO_GOB \
|
|
|
|
fourcc_mod_code(NVIDIA, 0x15)
|
2016-11-08 15:50:42 +08:00
|
|
|
|
2018-03-17 06:04:35 +08:00
|
|
|
/*
|
|
|
|
* Some Broadcom modifiers take parameters, for example the number of
|
|
|
|
* vertical lines in the image. Reserve the lower 32 bits for modifier
|
|
|
|
* type, and the next 24 bits for parameters. Top 8 bits are the
|
|
|
|
* vendor code.
|
|
|
|
*/
|
|
|
|
#define __fourcc_mod_broadcom_param_shift 8
|
|
|
|
#define __fourcc_mod_broadcom_param_bits 48
|
|
|
|
#define fourcc_mod_broadcom_code(val, params) \
|
|
|
|
fourcc_mod_code(BROADCOM, ((((__u64)params) << __fourcc_mod_broadcom_param_shift) | val))
|
|
|
|
#define fourcc_mod_broadcom_param(m) \
|
|
|
|
((int)(((m) >> __fourcc_mod_broadcom_param_shift) & \
|
|
|
|
((1ULL << __fourcc_mod_broadcom_param_bits) - 1)))
|
|
|
|
#define fourcc_mod_broadcom_mod(m) \
|
|
|
|
((m) & ~(((1ULL << __fourcc_mod_broadcom_param_bits) - 1) << \
|
|
|
|
__fourcc_mod_broadcom_param_shift))
|
|
|
|
|
drm/vc4: Add T-format scanout support.
The T tiling format is what V3D uses for textures, with no raster
support at all until later revisions of the hardware (and always at a
large 3D performance penalty). If we can't scan out V3D's format,
then we often need to do a relayout at some stage of the pipeline,
either right before texturing from the scanout buffer (common in X11
without a compositor) or between a tiled screen buffer right before
scanout (an option I've considered in trying to resolve this
inconsistency, but which means needing to use the dirty fb ioctl and
having some update policy).
T-format scanout lets us avoid either of those shadow copies, for a
massive, obvious performance improvement to X11 window dragging
without a compositor. Unfortunately, enabling a compositor to work
around the discrepancy has turned out to be too costly in memory
consumption for the Raspbian distribution.
Because the HVS operates a scanline at a time, compositing from T does
increase the memory bandwidth cost of scanout. On my 1920x1080@32bpp
display on a RPi3, we go from about 15% of system memory bandwidth
with linear to about 20% with tiled. However, for X11 this still ends
up being a huge performance win in active usage.
This patch doesn't yet handle src_x/src_y offsetting within the tiled
buffer. However, we fail to do so for untiled buffers already.
Signed-off-by: Eric Anholt <eric@anholt.net>
Link: http://patchwork.freedesktop.org/patch/msgid/20170608001336.12842-1-eric@anholt.net
Reviewed-by: Boris Brezillon <boris.brezillon@free-electrons.com>
2017-06-08 08:13:35 +08:00
|
|
|
/*
|
|
|
|
* Broadcom VC4 "T" format
|
|
|
|
*
|
|
|
|
* This is the primary layout that the V3D GPU can texture from (it
|
|
|
|
* can't do linear). The T format has:
|
|
|
|
*
|
|
|
|
* - 64b utiles of pixels in a raster-order grid according to cpp. It's 4x4
|
|
|
|
* pixels at 32 bit depth.
|
|
|
|
*
|
|
|
|
* - 1k subtiles made of a 4x4 raster-order grid of 64b utiles (so usually
|
|
|
|
* 16x16 pixels).
|
|
|
|
*
|
|
|
|
* - 4k tiles made of a 2x2 grid of 1k subtiles (so usually 32x32 pixels). On
|
|
|
|
* even 4k tile rows, they're arranged as (BL, TL, TR, BR), and on odd rows
|
|
|
|
* they're (TR, BR, BL, TL), where bottom left is start of memory.
|
|
|
|
*
|
|
|
|
* - an image made of 4k tiles in rows either left-to-right (even rows of 4k
|
|
|
|
* tiles) or right-to-left (odd rows of 4k tiles).
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED fourcc_mod_code(BROADCOM, 1)
|
|
|
|
|
2018-03-17 06:04:35 +08:00
|
|
|
/*
|
|
|
|
* Broadcom SAND format
|
|
|
|
*
|
|
|
|
* This is the native format that the H.264 codec block uses. For VC4
|
|
|
|
* HVS, it is only valid for H.264 (NV12/21) and RGBA modes.
|
|
|
|
*
|
|
|
|
* The image can be considered to be split into columns, and the
|
|
|
|
* columns are placed consecutively into memory. The width of those
|
|
|
|
* columns can be either 32, 64, 128, or 256 pixels, but in practice
|
|
|
|
* only 128 pixel columns are used.
|
|
|
|
*
|
|
|
|
* The pitch between the start of each column is set to optimally
|
|
|
|
* switch between SDRAM banks. This is passed as the number of lines
|
|
|
|
* of column width in the modifier (we can't use the stride value due
|
|
|
|
* to various core checks that look at it , so you should set the
|
|
|
|
* stride to width*cpp).
|
|
|
|
*
|
|
|
|
* Note that the column height for this format modifier is the same
|
|
|
|
* for all of the planes, assuming that each column contains both Y
|
|
|
|
* and UV. Some SAND-using hardware stores UV in a separate tiled
|
|
|
|
* image from Y to reduce the column height, which is not supported
|
|
|
|
* with these modifiers.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(v) \
|
|
|
|
fourcc_mod_broadcom_code(2, v)
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_SAND64_COL_HEIGHT(v) \
|
|
|
|
fourcc_mod_broadcom_code(3, v)
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(v) \
|
|
|
|
fourcc_mod_broadcom_code(4, v)
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_SAND256_COL_HEIGHT(v) \
|
|
|
|
fourcc_mod_broadcom_code(5, v)
|
|
|
|
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_SAND32 \
|
|
|
|
DRM_FORMAT_MOD_BROADCOM_SAND32_COL_HEIGHT(0)
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_SAND64 \
|
|
|
|
DRM_FORMAT_MOD_BROADCOM_SAND64_COL_HEIGHT(0)
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_SAND128 \
|
|
|
|
DRM_FORMAT_MOD_BROADCOM_SAND128_COL_HEIGHT(0)
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_SAND256 \
|
|
|
|
DRM_FORMAT_MOD_BROADCOM_SAND256_COL_HEIGHT(0)
|
|
|
|
|
2018-06-21 08:17:03 +08:00
|
|
|
/* Broadcom UIF format
|
|
|
|
*
|
|
|
|
* This is the common format for the current Broadcom multimedia
|
|
|
|
* blocks, including V3D 3.x and newer, newer video codecs, and
|
|
|
|
* displays.
|
|
|
|
*
|
|
|
|
* The image consists of utiles (64b blocks), UIF blocks (2x2 utiles),
|
|
|
|
* and macroblocks (4x4 UIF blocks). Those 4x4 UIF block groups are
|
|
|
|
* stored in columns, with padding between the columns to ensure that
|
|
|
|
* moving from one column to the next doesn't hit the same SDRAM page
|
|
|
|
* bank.
|
|
|
|
*
|
|
|
|
* To calculate the padding, it is assumed that each hardware block
|
|
|
|
* and the software driving it knows the platform's SDRAM page size,
|
|
|
|
* number of banks, and XOR address, and that it's identical between
|
|
|
|
* all blocks using the format. This tiling modifier will use XOR as
|
|
|
|
* necessary to reduce the padding. If a hardware block can't do XOR,
|
|
|
|
* the assumption is that a no-XOR tiling modifier will be created.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_BROADCOM_UIF fourcc_mod_code(BROADCOM, 6)
|
|
|
|
|
2018-07-10 21:18:54 +08:00
|
|
|
/*
|
|
|
|
* Arm Framebuffer Compression (AFBC) modifiers
|
|
|
|
*
|
|
|
|
* AFBC is a proprietary lossless image compression protocol and format.
|
|
|
|
* It provides fine-grained random access and minimizes the amount of data
|
|
|
|
* transferred between IP blocks.
|
|
|
|
*
|
|
|
|
* AFBC has several features which may be supported and/or used, which are
|
|
|
|
* represented using bits in the modifier. Not all combinations are valid,
|
|
|
|
* and different devices or use-cases may support different combinations.
|
2018-12-03 19:31:57 +08:00
|
|
|
*
|
|
|
|
* Further information on the use of AFBC modifiers can be found in
|
|
|
|
* Documentation/gpu/afbc.rst
|
2018-07-10 21:18:54 +08:00
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_ARM_AFBC(__afbc_mode) fourcc_mod_code(ARM, __afbc_mode)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* AFBC superblock size
|
|
|
|
*
|
|
|
|
* Indicates the superblock size(s) used for the AFBC buffer. The buffer
|
|
|
|
* size (in pixels) must be aligned to a multiple of the superblock size.
|
|
|
|
* Four lowest significant bits(LSBs) are reserved for block size.
|
2019-01-09 23:58:37 +08:00
|
|
|
*
|
|
|
|
* Where one superblock size is specified, it applies to all planes of the
|
|
|
|
* buffer (e.g. 16x16, 32x8). When multiple superblock sizes are specified,
|
|
|
|
* the first applies to the Luma plane and the second applies to the Chroma
|
|
|
|
* plane(s). e.g. (32x8_64x4 means 32x8 Luma, with 64x4 Chroma).
|
|
|
|
* Multiple superblock sizes are only valid for multi-plane YCbCr formats.
|
2018-07-10 21:18:54 +08:00
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_BLOCK_SIZE_MASK 0xf
|
|
|
|
#define AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 (1ULL)
|
|
|
|
#define AFBC_FORMAT_MOD_BLOCK_SIZE_32x8 (2ULL)
|
2019-01-09 23:58:37 +08:00
|
|
|
#define AFBC_FORMAT_MOD_BLOCK_SIZE_64x4 (3ULL)
|
|
|
|
#define AFBC_FORMAT_MOD_BLOCK_SIZE_32x8_64x4 (4ULL)
|
2018-07-10 21:18:54 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* AFBC lossless colorspace transform
|
|
|
|
*
|
|
|
|
* Indicates that the buffer makes use of the AFBC lossless colorspace
|
|
|
|
* transform.
|
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_YTR (1ULL << 4)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* AFBC block-split
|
|
|
|
*
|
|
|
|
* Indicates that the payload of each superblock is split. The second
|
|
|
|
* half of the payload is positioned at a predefined offset from the start
|
|
|
|
* of the superblock payload.
|
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_SPLIT (1ULL << 5)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* AFBC sparse layout
|
|
|
|
*
|
|
|
|
* This flag indicates that the payload of each superblock must be stored at a
|
|
|
|
* predefined position relative to the other superblocks in the same AFBC
|
|
|
|
* buffer. This order is the same order used by the header buffer. In this mode
|
|
|
|
* each superblock is given the same amount of space as an uncompressed
|
|
|
|
* superblock of the particular format would require, rounding up to the next
|
|
|
|
* multiple of 128 bytes in size.
|
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_SPARSE (1ULL << 6)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* AFBC copy-block restrict
|
|
|
|
*
|
|
|
|
* Buffers with this flag must obey the copy-block restriction. The restriction
|
|
|
|
* is such that there are no copy-blocks referring across the border of 8x8
|
|
|
|
* blocks. For the subsampled data the 8x8 limitation is also subsampled.
|
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_CBR (1ULL << 7)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* AFBC tiled layout
|
|
|
|
*
|
|
|
|
* The tiled layout groups superblocks in 8x8 or 4x4 tiles, where all
|
|
|
|
* superblocks inside a tile are stored together in memory. 8x8 tiles are used
|
|
|
|
* for pixel formats up to and including 32 bpp while 4x4 tiles are used for
|
|
|
|
* larger bpp formats. The order between the tiles is scan line.
|
|
|
|
* When the tiled layout is used, the buffer size (in pixels) must be aligned
|
|
|
|
* to the tile size.
|
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_TILED (1ULL << 8)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* AFBC solid color blocks
|
|
|
|
*
|
|
|
|
* Indicates that the buffer makes use of solid-color blocks, whereby bandwidth
|
|
|
|
* can be reduced if a whole superblock is a single color.
|
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_SC (1ULL << 9)
|
|
|
|
|
2019-01-09 23:58:37 +08:00
|
|
|
/*
|
|
|
|
* AFBC double-buffer
|
|
|
|
*
|
|
|
|
* Indicates that the buffer is allocated in a layout safe for front-buffer
|
|
|
|
* rendering.
|
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_DB (1ULL << 10)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* AFBC buffer content hints
|
|
|
|
*
|
|
|
|
* Indicates that the buffer includes per-superblock content hints.
|
|
|
|
*/
|
|
|
|
#define AFBC_FORMAT_MOD_BCH (1ULL << 11)
|
|
|
|
|
2019-01-18 22:51:21 +08:00
|
|
|
/*
|
|
|
|
* Allwinner tiled modifier
|
|
|
|
*
|
|
|
|
* This tiling mode is implemented by the VPU found on all Allwinner platforms,
|
|
|
|
* codenamed sunxi. It is associated with a YUV format that uses either 2 or 3
|
|
|
|
* planes.
|
|
|
|
*
|
|
|
|
* With this tiling, the luminance samples are disposed in tiles representing
|
|
|
|
* 32x32 pixels and the chrominance samples in tiles representing 32x64 pixels.
|
|
|
|
* The pixel order in each tile is linear and the tiles are disposed linearly,
|
|
|
|
* both in row-major order.
|
|
|
|
*/
|
|
|
|
#define DRM_FORMAT_MOD_ALLWINNER_TILED fourcc_mod_code(ALLWINNER, 1)
|
|
|
|
|
2016-04-08 01:49:00 +08:00
|
|
|
#if defined(__cplusplus)
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2011-11-15 06:51:28 +08:00
|
|
|
#endif /* DRM_FOURCC_H */
|