On Thu, Jul 01, 2021 at 06:07:09PM +0100, Normunds Rieksts wrote:
Arm Fixed Rate Compression (AFRC) is a proprietary fixed rate image compression protocol and format. It is designed to provide guaranteed bandwidth and memory footprint reductions in graphics and media use-cases.
This patch aims to add modifier definitions for describing AFRC.
Signed-off-by: Normunds Rieksts normunds.rieksts@arm.com
Looks good to me!
Reviewed-by: Liviu Dudau liviu.dudau@arm.com
Best regards, Liviu
include/uapi/drm/drm_fourcc.h | 109 +++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 3 deletions(-)
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h index f7156322aba5..9f4bb4a6f358 100644 --- a/include/uapi/drm/drm_fourcc.h +++ b/include/uapi/drm/drm_fourcc.h @@ -900,9 +900,9 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier)
/*
- The top 4 bits (out of the 56 bits alloted for specifying vendor specific
- modifiers) denote the category for modifiers. Currently we have only two
- categories of modifiers ie AFBC and MISC. We can have a maximum of sixteen
- different categories.
- modifiers) denote the category for modifiers. Currently we have three
- categories of modifiers ie AFBC, MISC and AFRC. We can have a maximum of
*/
- sixteen different categories.
#define DRM_FORMAT_MOD_ARM_CODE(__type, __val) \ fourcc_mod_code(ARM, ((__u64)(__type) << 52) | ((__val) & 0x000fffffffffffffULL)) @@ -1017,6 +1017,109 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier) */ #define AFBC_FORMAT_MOD_USM (1ULL << 12)
+/*
- Arm Fixed-Rate Compression (AFRC) modifiers
- AFRC is a proprietary fixed rate image compression protocol and format,
- designed to provide guaranteed bandwidth and memory footprint
- reductions in graphics and media use-cases.
- AFRC buffers consist of one or more planes, with the same components
- and meaning as an uncompressed buffer using the same pixel format.
- Within each plane, the pixel/luma/chroma values are grouped into
- "coding unit" blocks which are individually compressed to a
- fixed size (in bytes). All coding units within a given plane of a buffer
- store the same number of values, and have the same compressed size.
- The coding unit size is configurable, allowing different rates of compression.
- The start of each AFRC buffer plane must be aligned to an alignment granule which
- depends on the coding unit size.
- Coding Unit Size Plane Alignment
- 16 bytes 1024 bytes
- 24 bytes 512 bytes
- 32 bytes 2048 bytes
- Coding units are grouped into paging tiles. AFRC buffer dimensions must be aligned
- to a multiple of the paging tile dimensions.
- The dimensions of each paging tile depend on whether the buffer is optimised for
- scanline (SCAN layout) or rotated (ROT layout) access.
- Layout Paging Tile Width Paging Tile Height
- SCAN 16 coding units 4 coding units
- ROT 8 coding units 8 coding units
- The dimensions of each coding unit depend on the number of components
- in the compressed plane and whether the buffer is optimised for
- scanline (SCAN layout) or rotated (ROT layout) access.
- Number of Components in Plane Layout Coding Unit Width Coding Unit Height
- 1 SCAN 16 samples 4 samples
- Example: 16x4 luma samples in a 'Y' plane
16x4 chroma 'V' values, in the 'V' plane of a fully-planar YUV buffer
- 1 ROT 8 samples 8 samples
- Example: 8x8 luma samples in a 'Y' plane
8x8 chroma 'V' values, in the 'V' plane of a fully-planar YUV buffer
- 2 DONT CARE 8 samples 4 samples
- Example: 8x4 chroma pairs in the 'UV' plane of a semi-planar YUV buffer
- 3 DONT CARE 4 samples 4 samples
- Example: 4x4 pixels in an RGB buffer without alpha
- 4 DONT CARE 4 samples 4 samples
- Example: 4x4 pixels in an RGB buffer with alpha
- */
+#define DRM_FORMAT_MOD_ARM_TYPE_AFRC 0x02
+#define DRM_FORMAT_MOD_ARM_AFRC(__afrc_mode) \
- DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_AFRC, __afrc_mode)
+/*
- AFRC coding unit size modifier.
- Indicates the number of bytes used to store each compressed coding unit for
- one or more planes in an AFRC encoded buffer. The coding unit size for chrominance
- is the same for both Cb and Cr, which may be stored in separate planes.
- AFRC_FORMAT_MOD_CU_SIZE_P0 indicates the number of bytes used to store
- each compressed coding unit in the first plane of the buffer. For RGBA buffers
- this is the only plane, while for semi-planar and fully-planar YUV buffers,
- this corresponds to the luma plane.
- AFRC_FORMAT_MOD_CU_SIZE_P12 indicates the number of bytes used to store
- each compressed coding unit in the second and third planes in the buffer.
- For semi-planar and fully-planar YUV buffers, this corresponds to the chroma plane(s).
- For single-plane buffers, AFRC_FORMAT_MOD_CU_SIZE_P0 must be specified
- and AFRC_FORMAT_MOD_CU_SIZE_P12 must be zero.
- For semi-planar and fully-planar buffers, both AFRC_FORMAT_MOD_CU_SIZE_P0 and
- AFRC_FORMAT_MOD_CU_SIZE_P12 must be specified.
- */
+#define AFRC_FORMAT_MOD_CU_SIZE_MASK 0xf +#define AFRC_FORMAT_MOD_CU_SIZE_16 (1ULL) +#define AFRC_FORMAT_MOD_CU_SIZE_24 (2ULL) +#define AFRC_FORMAT_MOD_CU_SIZE_32 (3ULL)
+#define AFRC_FORMAT_MOD_CU_SIZE_P0(__afrc_cu_size) (__afrc_cu_size) +#define AFRC_FORMAT_MOD_CU_SIZE_P12(__afrc_cu_size) ((__afrc_cu_size) << 4)
+/*
- AFRC scanline memory layout.
- Indicates if the buffer uses the scanline-optimised layout
- for an AFRC encoded buffer, otherwise, it uses the rotation-optimised layout.
- The memory layout is the same for all planes.
- */
+#define AFRC_FORMAT_MOD_LAYOUT_SCAN (1ULL << 8)
/*
- Arm 16x16 Block U-Interleaved modifier
-- 2.17.1