1 /* 2 * Copyright (c) 2014, 2016-2020, The Linux Foundation. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without modification, are permitted 5 * provided that the following conditions are met: 6 * * Redistributions of source code must retain the above copyright notice, this list of 7 * conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above copyright notice, this list of 9 * conditions and the following disclaimer in the documentation and/or other materials provided 10 * with the distribution. 11 * * Neither the name of The Linux Foundation nor the names of its contributors may be used to 12 * endorse or promote products derived from this software without specific prior written 13 * permission. 14 * 15 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 16 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 19 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 21 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 */ 24 25 /*! @file layer_buffer.h 26 @brief File for layer buffer structure. 27 28 */ 29 #ifndef __LAYER_BUFFER_H__ 30 #define __LAYER_BUFFER_H__ 31 32 #include <utils/fence.h> 33 #include <stdint.h> 34 #include <color_metadata.h> 35 #include <utility> 36 #include <vector> 37 #include "sdm_types.h" 38 39 namespace sdm { 40 41 #define NUM_UBWC_CR_STATS_LAYERS 2 42 typedef std::vector<std::pair<int, int>> UbwcCrStatsVector; 43 44 /*! @brief This enum represents display layer inverse gamma correction (IGC) types. 45 46 @sa Layer 47 */ 48 enum LayerIGC { 49 kIGCNotSpecified, //!< IGC is not specified. 50 kIGCsRGB, //!< sRGB IGC type. 51 }; 52 53 /*! @brief This enum represents different buffer formats supported by display manager. 54 55 @sa LayerBuffer 56 */ 57 enum LayerBufferFormat { 58 /* All RGB formats, Any new format will be added towards end of this group to maintain backward 59 compatibility. 60 */ 61 kFormatARGB8888, //!< 8-bits Alpha, Red, Green, Blue interleaved in ARGB order. 62 kFormatRGBA8888, //!< 8-bits Red, Green, Blue, Alpha interleaved in RGBA order. 63 kFormatBGRA8888, //!< 8-bits Blue, Green, Red, Alpha interleaved in BGRA order. 64 kFormatXRGB8888, //!< 8-bits Padding, Red, Green, Blue interleaved in XRGB order. No Alpha. 65 kFormatRGBX8888, //!< 8-bits Red, Green, Blue, Padding interleaved in RGBX order. No Alpha. 66 kFormatBGRX8888, //!< 8-bits Blue, Green, Red, Padding interleaved in BGRX order. No Alpha. 67 kFormatRGBA5551, //!< 5-bits Red, Green, Blue, and 1 bit Alpha interleaved in RGBA order. 68 kFormatRGBA4444, //!< 4-bits Red, Green, Blue, Alpha interleaved in RGBA order. 69 kFormatRGB888, //!< 8-bits Red, Green, Blue interleaved in RGB order. No Alpha. 70 kFormatBGR888, //!< 8-bits Blue, Green, Red interleaved in BGR order. No Alpha. 71 kFormatRGB565, //!< 5-bit Red, 6-bit Green, 5-bit Blue interleaved in RGB order. No Alpha. 72 kFormatBGR565, //!< 5-bit Blue, 6-bit Green, 5-bit Red interleaved in BGR order. No Alpha. 73 kFormatRGBA8888Ubwc, //!< UBWC aligned RGBA8888 format 74 kFormatRGBX8888Ubwc, //!< UBWC aligned RGBX8888 format 75 kFormatBGR565Ubwc, //!< UBWC aligned BGR565 format 76 kFormatRGBA1010102, //!< 10-bits Red, Green, Blue, Alpha interleaved in RGBA order. 77 kFormatARGB2101010, //!< 10-bits Alpha, Red, Green, Blue interleaved in ARGB order. 78 kFormatRGBX1010102, //!< 10-bits Red, Green, Blue, Padding interleaved in RGBX order. No Alpha. 79 kFormatXRGB2101010, //!< 10-bits Padding, Red, Green, Blue interleaved in XRGB order. No Alpha. 80 kFormatBGRA1010102, //!< 10-bits Blue, Green, Red, Alpha interleaved in BGRA order. 81 kFormatABGR2101010, //!< 10-bits Alpha, Blue, Green, Red interleaved in ABGR order. 82 kFormatBGRX1010102, //!< 10-bits Blue, Green, Red, Padding interleaved in BGRX order. No Alpha. 83 kFormatXBGR2101010, //!< 10-bits Padding, Blue, Green, Red interleaved in XBGR order. No Alpha. 84 kFormatRGBA1010102Ubwc, //!< UBWC aligned RGBA1010102 format 85 kFormatRGBX1010102Ubwc, //!< UBWC aligned RGBX1010102 format 86 kFormatRGB101010, // 10-bits Red, Green, Blue, interleaved in RGB order. No Alpha. 87 88 /* All YUV-Planar formats, Any new format will be added towards end of this group to maintain 89 backward compatibility. 90 */ 91 kFormatYCbCr420Planar = 0x100, //!< Y-plane: y(0), y(1), y(2) ... y(n) 92 //!< 2x2 subsampled U-plane: u(0), u(2) ... u(n-1) 93 //!< 2x2 subsampled V-plane: v(0), v(2) ... v(n-1) 94 95 kFormatYCrCb420Planar, //!< Y-plane: y(0), y(1), y(2) ... y(n) 96 //!< 2x2 subsampled V-plane: v(0), v(2) ... v(n-1) 97 //!< 2x2 subsampled U-plane: u(0), u(2) ... u(n-1) 98 99 kFormatYCrCb420PlanarStride16, //!< kFormatYCrCb420Planar with stride aligned to 16 bytes 100 101 /* All YUV-Semiplanar formats, Any new format will be added towards end of this group to 102 maintain backward compatibility. 103 */ 104 kFormatYCbCr420SemiPlanar = 0x200, //!< Y-plane: y(0), y(1), y(2) ... y(n) 105 //!< 2x2 subsampled interleaved UV-plane: 106 //!< u(0), v(0), u(2), v(2) ... u(n-1), v(n-1) 107 //!< aka NV12. 108 109 kFormatYCrCb420SemiPlanar, //!< Y-plane: y(0), y(1), y(2) ... y(n) 110 //!< 2x2 subsampled interleaved VU-plane: 111 //!< v(0), u(0), v(2), u(2) ... v(n-1), u(n-1) 112 //!< aka NV21. 113 114 kFormatYCbCr420SemiPlanarVenus, //!< Y-plane: y(0), y(1), y(2) ... y(n) 115 //!< 2x2 subsampled interleaved UV-plane: 116 //!< u(0), v(0), u(2), v(2) ... u(n-1), v(n-1) 117 118 kFormatYCbCr422H1V2SemiPlanar, //!< Y-plane: y(0), y(1), y(2) ... y(n) 119 //!< vertically subsampled interleaved UV-plane: 120 //!< u(0), v(1), u(2), v(3) ... u(n-1), v(n) 121 122 kFormatYCrCb422H1V2SemiPlanar, //!< Y-plane: y(0), y(1), y(2) ... y(n) 123 //!< vertically subsampled interleaved VU-plane: 124 //!< v(0), u(1), v(2), u(3) ... v(n-1), u(n) 125 126 kFormatYCbCr422H2V1SemiPlanar, //!< Y-plane: y(0), y(1), y(2) ... y(n) 127 //!< horizontally subsampled interleaved UV-plane: 128 //!< u(0), v(1), u(2), v(3) ... u(n-1), v(n) 129 130 kFormatYCrCb422H2V1SemiPlanar, //!< Y-plane: y(0), y(1), y(2) ... y(n) 131 //!< horizontally subsampled interleaved VU-plane: 132 //!< v(0), u(1), v(2), u(3) ... v(n-1), u(n) 133 134 kFormatYCbCr420SPVenusUbwc, //!< UBWC aligned YCbCr420SemiPlanarVenus format 135 136 kFormatYCrCb420SemiPlanarVenus, //!< Y-plane: y(0), y(1), y(2) ... y(n) 137 //!< 2x2 subsampled interleaved UV-plane: 138 //!< v(0), u(0), v(2), u(2) ... v(n-1), u(n-1) 139 140 kFormatYCbCr420P010, //!< 16 bit Y-plane with 5 MSB bits set to 0: 141 //!< y(0), y(1), y(2) ... y(n) 142 //!< 2x2 subsampled interleaved 10 bit UV-plane with 143 //!< 5 MSB bits set to 0: 144 //!< u(0), v(0), u(2), v(2) ... u(n-1), v(n-1) 145 //!< aka P010. 146 147 kFormatYCbCr420TP10Ubwc, //!< UBWC aligned YCbCr420TP10 format. 148 149 kFormatYCbCr420P010Ubwc, //!< UBWC aligned YCbCr420P010 format. 150 151 kFormatYCbCr420P010Venus, //!< Venus aligned YCbCr420P010 format. 152 //! 153 kFormatYCbCr420SPVenusTile, //!< Tiled & uncompressed YCbCr420SemiPlanarVenus format 154 kFormatYCbCr420TP10Tile, //!< Tiled & uncompressed YCbCr420TP10 format. 155 kFormatYCbCr420P010Tile, //!< Tiled & uncompressed YCbCr420P010 format. 156 157 /* All YUV-Packed formats, Any new format will be added towards end of this group to maintain 158 backward compatibility. 159 */ 160 kFormatYCbCr422H2V1Packed = 0x300, //!< Y-plane interleaved with horizontally subsampled U/V by 161 //!< factor of 2 162 //!< y(0), u(0), y(1), v(0), y(2), u(2), y(3), v(2) 163 //!< y(n-1), u(n-1), y(n), v(n-1) 164 165 kFormatCbYCrY422H2V1Packed, 166 kFormatInvalid = 0xFFFFFFFF, 167 }; 168 169 /*! @brief This structure defines a color sample plane belonging to a buffer format. RGB buffer 170 formats have 1 plane whereas YUV buffer formats may have upto 4 planes. 171 172 @sa LayerBuffer 173 */ 174 struct LayerBufferPlane { 175 int fd = -1; //!< File descriptor referring to the buffer associated with this plane. 176 uint32_t offset = 0; //!< Offset of the plane in bytes from beginning of the buffer. 177 uint32_t stride = 0; //!< Stride in bytes i.e. length of a scanline including padding. 178 }; 179 180 /*! @brief This structure defines flags associated with a layer buffer. The 1-bit flag can be set 181 to ON(1) or OFF(0). 182 183 @sa LayerBuffer 184 */ 185 struct LayerBufferFlags { 186 union { 187 struct { 188 uint32_t secure : 1; //!< This flag shall be set by client to indicate that the 189 //!< buffer need to be handled securely. 190 191 uint32_t video : 1; //!< This flag shall be set by client to indicate that the 192 //!< buffer is video/ui buffer. 193 194 uint32_t macro_tile : 1; //!< This flag shall be set by client to indicate that the 195 //!< buffer format is macro tiled. 196 197 uint32_t interlace : 1; //!< This flag shall be set by the client to indicate that 198 //!< the buffer has interlaced content. 199 200 uint32_t secure_display : 1; //!< This flag shall be set by the client to indicate that the 201 //!< secure display session is in progress. Secure display 202 //!< session can not coexist with non-secure session. 203 204 uint32_t secure_camera : 1; //!< This flag shall be set by the client to indicate that the 205 //!< buffer is associated with secure camera session. A secure 206 //!< camera layer can co-exist with non-secure layer(s). 207 208 uint32_t hdr : 1; //!< This flag shall be set by the client to indicate that the 209 //!< the content is HDR. 210 211 uint32_t ubwc_pi : 1; //!< This flag shall be set by the client to indicate that the 212 //!< buffer has PI content. 213 214 uint32_t mask_layer : 1; //!< This flag shall be set by client to indicate that the layer 215 //!< is union of solid fill regions typically transparent pixels 216 //!< and black pixels. 217 218 uint32_t game : 1; //!< This flag shall be set by the client to indicate that the 219 //!< the content is game. 220 }; 221 222 uint32_t flags = 0; //!< For initialization purpose only. 223 //!< Client shall not refer to it directly. 224 }; 225 }; 226 227 /*! @brief This structure defines a layer buffer handle which contains raw buffer and its associated 228 properties. 229 230 @sa LayerBuffer 231 @sa LayerStack 232 */ 233 struct LayerBuffer { 234 uint32_t width = 0; //!< Aligned width of the Layer that this buffer is for. 235 uint32_t height = 0; //!< Aligned height of the Layer that this buffer is for. 236 uint32_t unaligned_width = 0; 237 //!< Unaligned width of the Layer that this buffer is for. 238 uint32_t unaligned_height = 0; 239 //!< Unaligned height of the Layer that this buffer is for. 240 uint32_t size = 0; //!< Size of a single buffer (even if multiple clubbed together) 241 LayerBufferFormat format = kFormatRGBA8888; //!< Format of the buffer content. 242 ColorMetaData color_metadata = {}; //!< CSC + Range + Transfer + Matrix + HDR Info 243 LayerIGC igc = kIGCNotSpecified; //!< IGC that will be applied on this layer. 244 LayerBufferPlane planes[4] = {}; 245 //!< Array of planes that this buffer contains. RGB buffer formats 246 //!< have 1 plane whereas YUV buffer formats may have upto 4 planes 247 //!< Total number of planes for the buffer will be interpreted based 248 //!< on the buffer format specified. 249 250 shared_ptr<Fence> acquire_fence = nullptr; 251 //!< File descriptor referring to a sync fence object which will be 252 //!< signaled when buffer can be read/write by display manager. 253 //!< This fence object is set by the client during Commit(). For 254 //!< input buffers client shall signal this fence when buffer 255 //!< content is available and can be read by display manager. For 256 //!< output buffers, client shall signal fence when buffer is ready 257 //!< to be written by display manager. 258 259 //!< This field is used only during Commit() and shall be set to -1 260 //!< by the client when buffer is already available for read/write. 261 262 shared_ptr<Fence> release_fence = nullptr; 263 //!< File descriptor referring to a sync fence object which will be 264 //!< signaled when buffer has been read/written by display manager. 265 //!< This fence object is set by display manager during Commit(). 266 //!< For input buffers display manager will signal this fence when 267 //!< buffer has been consumed. For output buffers, display manager 268 //!< will signal this fence when buffer is produced. 269 270 //!< This field is used only during Commit() and will be set to -1 271 //!< by display manager when buffer is already available for 272 //!< read/write. 273 274 LayerBufferFlags flags; //!< Flags associated with this buffer. 275 276 uint64_t buffer_id __attribute__((aligned(8))) = 0; 277 //!< Specifies the buffer id. 278 UbwcCrStatsVector ubwc_crstats[NUM_UBWC_CR_STATS_LAYERS] = {}; 279 //! < UBWC Compression ratio,stats. Stored as a vector of pair of 280 //! of (tile size, #of tiles) LayerBufferLayerBuffer281 LayerBuffer() { 282 color_metadata.colorPrimaries = ColorPrimaries_BT709_5; 283 color_metadata.transfer = Transfer_sRGB; 284 } 285 286 uint64_t handle_id = 0; 287 }; 288 289 // This enum represents buffer layout types. 290 enum BufferLayout { 291 kLinear, //!< Linear data 292 kUBWC, //!< UBWC aligned data 293 kTPTiled //!< Tightly Packed data 294 }; 295 296 class LayerBufferObject { 297 public: ~LayerBufferObject()298 virtual ~LayerBufferObject() {} 299 }; 300 301 } // namespace sdm 302 303 #endif // __LAYER_BUFFER_H__ 304 305