1.. SPDX-License-Identifier: GPL-2.0+ 2 3=================================== 4 Arm Framebuffer Compression (AFBC) 5=================================== 6 7AFBC is a proprietary lossless image compression protocol and format. 8It provides fine-grained random access and minimizes the amount of 9data transferred between IP blocks. 10 11AFBC can be enabled on drivers which support it via use of the AFBC 12format modifiers defined in drm_fourcc.h. See DRM_FORMAT_MOD_ARM_AFBC(*). 13 14All users of the AFBC modifiers must follow the usage guidelines laid 15out in this document, to ensure compatibility across different AFBC 16producers and consumers. 17 18Components and Ordering 19======================= 20 21AFBC streams can contain several components - where a component 22corresponds to a color channel (i.e. R, G, B, X, A, Y, Cb, Cr). 23The assignment of input/output color channels must be consistent 24between the encoder and the decoder for correct operation, otherwise 25the consumer will interpret the decoded data incorrectly. 26 27Furthermore, when the lossless colorspace transform is used 28(AFBC_FORMAT_MOD_YTR, which should be enabled for RGB buffers for 29maximum compression efficiency), the component order must be: 30 31 * Component 0: R 32 * Component 1: G 33 * Component 2: B 34 35The component ordering is communicated via the fourcc code in the 36fourcc:modifier pair. In general, component '0' is considered to 37reside in the least-significant bits of the corresponding linear 38format. For example, COMP(bits): 39 40 * DRM_FORMAT_ABGR8888 41 42 * Component 0: R(8) 43 * Component 1: G(8) 44 * Component 2: B(8) 45 * Component 3: A(8) 46 47 * DRM_FORMAT_BGR888 48 49 * Component 0: R(8) 50 * Component 1: G(8) 51 * Component 2: B(8) 52 53 * DRM_FORMAT_YUYV 54 55 * Component 0: Y(8) 56 * Component 1: Cb(8, 2x1 subsampled) 57 * Component 2: Cr(8, 2x1 subsampled) 58 59In AFBC, 'X' components are not treated any differently from any other 60component. Therefore, an AFBC buffer with fourcc DRM_FORMAT_XBGR8888 61encodes with 4 components, like so: 62 63 * DRM_FORMAT_XBGR8888 64 65 * Component 0: R(8) 66 * Component 1: G(8) 67 * Component 2: B(8) 68 * Component 3: X(8) 69 70Please note, however, that the inclusion of a "wasted" 'X' channel is 71bad for compression efficiency, and so it's recommended to avoid 72formats containing 'X' bits. If a fourth component is 73required/expected by the encoder/decoder, then it is recommended to 74instead use an equivalent format with alpha, setting all alpha bits to 75'1'. If there is no requirement for a fourth component, then a format 76which doesn't include alpha can be used, e.g. DRM_FORMAT_BGR888. 77 78Number of Planes 79================ 80 81Formats which are typically multi-planar in linear layouts (e.g. YUV 82420), can be encoded into one, or multiple, AFBC planes. As with 83component order, the encoder and decoder must agree about the number 84of planes in order to correctly decode the buffer. The fourcc code is 85used to determine the number of encoded planes in an AFBC buffer, 86matching the number of planes for the linear (unmodified) format. 87Within each plane, the component ordering also follows the fourcc 88code: 89 90For example: 91 92 * DRM_FORMAT_YUYV: nplanes = 1 93 94 * Plane 0: 95 96 * Component 0: Y(8) 97 * Component 1: Cb(8, 2x1 subsampled) 98 * Component 2: Cr(8, 2x1 subsampled) 99 100 * DRM_FORMAT_NV12: nplanes = 2 101 102 * Plane 0: 103 104 * Component 0: Y(8) 105 106 * Plane 1: 107 108 * Component 0: Cb(8, 2x1 subsampled) 109 * Component 1: Cr(8, 2x1 subsampled) 110 111Cross-device interoperability 112============================= 113 114For maximum compatibility across devices, the table below defines 115canonical formats for use between AFBC-enabled devices. Formats which 116are listed here must be used exactly as specified when using the AFBC 117modifiers. Formats which are not listed should be avoided. 118 119.. flat-table:: AFBC formats 120 121 * - Fourcc code 122 - Description 123 - Planes/Components 124 125 * - DRM_FORMAT_ABGR2101010 126 - 10-bit per component RGB, with 2-bit alpha 127 - Plane 0: 4 components 128 * Component 0: R(10) 129 * Component 1: G(10) 130 * Component 2: B(10) 131 * Component 3: A(2) 132 133 * - DRM_FORMAT_ABGR8888 134 - 8-bit per component RGB, with 8-bit alpha 135 - Plane 0: 4 components 136 * Component 0: R(8) 137 * Component 1: G(8) 138 * Component 2: B(8) 139 * Component 3: A(8) 140 141 * - DRM_FORMAT_BGR888 142 - 8-bit per component RGB 143 - Plane 0: 3 components 144 * Component 0: R(8) 145 * Component 1: G(8) 146 * Component 2: B(8) 147 148 * - DRM_FORMAT_BGR565 149 - 5/6-bit per component RGB 150 - Plane 0: 3 components 151 * Component 0: R(5) 152 * Component 1: G(6) 153 * Component 2: B(5) 154 155 * - DRM_FORMAT_ABGR1555 156 - 5-bit per component RGB, with 1-bit alpha 157 - Plane 0: 4 components 158 * Component 0: R(5) 159 * Component 1: G(5) 160 * Component 2: B(5) 161 * Component 3: A(1) 162 163 * - DRM_FORMAT_VUY888 164 - 8-bit per component YCbCr 444, single plane 165 - Plane 0: 3 components 166 * Component 0: Y(8) 167 * Component 1: Cb(8) 168 * Component 2: Cr(8) 169 170 * - DRM_FORMAT_VUY101010 171 - 10-bit per component YCbCr 444, single plane 172 - Plane 0: 3 components 173 * Component 0: Y(10) 174 * Component 1: Cb(10) 175 * Component 2: Cr(10) 176 177 * - DRM_FORMAT_YUYV 178 - 8-bit per component YCbCr 422, single plane 179 - Plane 0: 3 components 180 * Component 0: Y(8) 181 * Component 1: Cb(8, 2x1 subsampled) 182 * Component 2: Cr(8, 2x1 subsampled) 183 184 * - DRM_FORMAT_NV16 185 - 8-bit per component YCbCr 422, two plane 186 - Plane 0: 1 component 187 * Component 0: Y(8) 188 Plane 1: 2 components 189 * Component 0: Cb(8, 2x1 subsampled) 190 * Component 1: Cr(8, 2x1 subsampled) 191 192 * - DRM_FORMAT_Y210 193 - 10-bit per component YCbCr 422, single plane 194 - Plane 0: 3 components 195 * Component 0: Y(10) 196 * Component 1: Cb(10, 2x1 subsampled) 197 * Component 2: Cr(10, 2x1 subsampled) 198 199 * - DRM_FORMAT_P210 200 - 10-bit per component YCbCr 422, two plane 201 - Plane 0: 1 component 202 * Component 0: Y(10) 203 Plane 1: 2 components 204 * Component 0: Cb(10, 2x1 subsampled) 205 * Component 1: Cr(10, 2x1 subsampled) 206 207 * - DRM_FORMAT_YUV420_8BIT 208 - 8-bit per component YCbCr 420, single plane 209 - Plane 0: 3 components 210 * Component 0: Y(8) 211 * Component 1: Cb(8, 2x2 subsampled) 212 * Component 2: Cr(8, 2x2 subsampled) 213 214 * - DRM_FORMAT_YUV420_10BIT 215 - 10-bit per component YCbCr 420, single plane 216 - Plane 0: 3 components 217 * Component 0: Y(10) 218 * Component 1: Cb(10, 2x2 subsampled) 219 * Component 2: Cr(10, 2x2 subsampled) 220 221 * - DRM_FORMAT_NV12 222 - 8-bit per component YCbCr 420, two plane 223 - Plane 0: 1 component 224 * Component 0: Y(8) 225 Plane 1: 2 components 226 * Component 0: Cb(8, 2x2 subsampled) 227 * Component 1: Cr(8, 2x2 subsampled) 228 229 * - DRM_FORMAT_P010 230 - 10-bit per component YCbCr 420, two plane 231 - Plane 0: 1 component 232 * Component 0: Y(10) 233 Plane 1: 2 components 234 * Component 0: Cb(10, 2x2 subsampled) 235 * Component 1: Cr(10, 2x2 subsampled) 236