1 /*
2 * Copyright (c) 2014, 2016, 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 <stdint.h>
33 
34 #include "sdm_types.h"
35 
36 namespace sdm {
37 
38 /*! @brief This enum represents different buffer formats supported by display manager.
39 
40   @sa LayerBuffer
41 */
42 enum LayerBufferFormat {
43   /* All RGB formats, Any new format will be added towards end of this group to maintain backward
44      compatibility.
45   */
46   kFormatARGB8888,      //!< 8-bits Alpha, Red, Green, Blue interleaved in ARGB order.
47   kFormatRGBA8888,      //!< 8-bits Red, Green, Blue, Alpha interleaved in RGBA order.
48   kFormatBGRA8888,      //!< 8-bits Blue, Green, Red, Alpha interleaved in BGRA order.
49   kFormatXRGB8888,      //!< 8-bits Padding, Red, Green, Blue interleaved in XRGB order. No Alpha.
50   kFormatRGBX8888,      //!< 8-bits Red, Green, Blue, Padding interleaved in RGBX order. No Alpha.
51   kFormatBGRX8888,      //!< 8-bits Blue, Green, Red, Padding interleaved in BGRX order. No Alpha.
52   kFormatRGBA5551,      //!< 5-bits Red, Green, Blue, and 1 bit Alpha interleaved in RGBA order.
53   kFormatRGBA4444,      //!< 4-bits Red, Green, Blue, Alpha interleaved in RGBA order.
54   kFormatRGB888,        //!< 8-bits Red, Green, Blue interleaved in RGB order. No Alpha.
55   kFormatBGR888,        //!< 8-bits Blue, Green, Red interleaved in BGR order. No Alpha.
56   kFormatRGB565,        //!< 5-bit Red, 6-bit Green, 5-bit Blue interleaved in RGB order. No Alpha.
57   kFormatBGR565,        //!< 5-bit Blue, 6-bit Green, 5-bit Red interleaved in BGR order. No Alpha.
58   kFormatRGBA8888Ubwc,  //!< UBWC aligned RGBA8888 format
59   kFormatRGBX8888Ubwc,  //!< UBWC aligned RGBX8888 format
60   kFormatBGR565Ubwc,    //!< UBWC aligned BGR565 format
61   kFormatRGBA1010102,   //!< 10-bits Red, Green, Blue, Alpha interleaved in RGBA order.
62   kFormatARGB2101010,   //!< 10-bits Alpha, Red, Green, Blue interleaved in ARGB order.
63   kFormatRGBX1010102,   //!< 10-bits Red, Green, Blue, Padding interleaved in RGBX order. No Alpha.
64   kFormatXRGB2101010,   //!< 10-bits Padding, Red, Green, Blue interleaved in XRGB order. No Alpha.
65   kFormatBGRA1010102,   //!< 10-bits Blue, Green, Red, Alpha interleaved in BGRA order.
66   kFormatABGR2101010,   //!< 10-bits Alpha, Blue, Green, Red interleaved in ABGR order.
67   kFormatBGRX1010102,   //!< 10-bits Blue, Green, Red, Padding interleaved in BGRX order. No Alpha.
68   kFormatXBGR2101010,   //!< 10-bits Padding, Blue, Green, Red interleaved in XBGR order. No Alpha.
69   kFormatRGBA1010102Ubwc,  //!< UBWC aligned RGBA1010102 format
70   kFormatRGBX1010102Ubwc,  //!< UBWC aligned RGBX1010102 format
71 
72   /* All YUV-Planar formats, Any new format will be added towards end of this group to maintain
73      backward compatibility.
74   */
75   kFormatYCbCr420Planar = 0x100,  //!< Y-plane: y(0), y(1), y(2) ... y(n)
76                                   //!< 2x2 subsampled U-plane: u(0), u(2) ... u(n-1)
77                                   //!< 2x2 subsampled V-plane: v(0), v(2) ... v(n-1)
78 
79   kFormatYCrCb420Planar,          //!< Y-plane: y(0), y(1), y(2) ... y(n)
80                                   //!< 2x2 subsampled V-plane: v(0), v(2) ... v(n-1)
81                                   //!< 2x2 subsampled U-plane: u(0), u(2) ... u(n-1)
82 
83   kFormatYCrCb420PlanarStride16,  //!< kFormatYCrCb420Planar with stride aligned to 16 bytes
84 
85   /* All YUV-Semiplanar formats, Any new format will be added towards end of this group to
86      maintain backward compatibility.
87   */
88   kFormatYCbCr420SemiPlanar = 0x200,  //!< Y-plane: y(0), y(1), y(2) ... y(n)
89                                       //!< 2x2 subsampled interleaved UV-plane:
90                                       //!<    u(0), v(0), u(2), v(2) ... u(n-1), v(n-1)
91                                       //!< aka NV12.
92 
93   kFormatYCrCb420SemiPlanar,          //!< Y-plane: y(0), y(1), y(2) ... y(n)
94                                       //!< 2x2 subsampled interleaved VU-plane:
95                                       //!<    v(0), u(0), v(2), u(2) ... v(n-1), u(n-1)
96                                       //!< aka NV21.
97 
98   kFormatYCbCr420SemiPlanarVenus,     //!< Y-plane: y(0), y(1), y(2) ... y(n)
99                                       //!< 2x2 subsampled interleaved UV-plane:
100                                       //!<    u(0), v(0), u(2), v(2) ... u(n-1), v(n-1)
101 
102   kFormatYCbCr422H1V2SemiPlanar,      //!< Y-plane: y(0), y(1), y(2) ... y(n)
103                                       //!< vertically subsampled interleaved UV-plane:
104                                       //!<    u(0), v(1), u(2), v(3) ... u(n-1), v(n)
105 
106   kFormatYCrCb422H1V2SemiPlanar,      //!< Y-plane: y(0), y(1), y(2) ... y(n)
107                                       //!< vertically subsampled interleaved VU-plane:
108                                       //!<    v(0), u(1), v(2), u(3) ... v(n-1), u(n)
109 
110   kFormatYCbCr422H2V1SemiPlanar,      //!< Y-plane: y(0), y(1), y(2) ... y(n)
111                                       //!< horizontally subsampled interleaved UV-plane:
112                                       //!<    u(0), v(1), u(2), v(3) ... u(n-1), v(n)
113 
114   kFormatYCrCb422H2V1SemiPlanar,      //!< Y-plane: y(0), y(1), y(2) ... y(n)
115                                       //!< horizontally subsampled interleaved VU-plane:
116                                       //!<    v(0), u(1), v(2), u(3) ... v(n-1), u(n)
117 
118   kFormatYCbCr420SPVenusUbwc,         //!< UBWC aligned YCbCr420SemiPlanarVenus format
119 
120   kFormatYCrCb420SemiPlanarVenus,     //!< Y-plane: y(0), y(1), y(2) ... y(n)
121                                       //!< 2x2 subsampled interleaved UV-plane:
122                                       //!<    v(0), u(0), v(2), u(2) ... v(n-1), u(n-1)
123 
124   kFormatYCbCr420P010,                //!< 16 bit Y-plane with 5 MSB bits set to 0:
125                                       //!< y(0), y(1), y(2) ... y(n)
126                                       //!< 2x2 subsampled interleaved 10 bit UV-plane with
127                                       //!< 5 MSB bits set to 0:
128                                       //!<    u(0), v(0), u(2), v(2) ... u(n-1), v(n-1)
129                                       //!< aka P010.
130 
131   kFormatYCbCr420TP10Ubwc,            //!< UBWC aligned YCbCr420TP10 format.
132 
133   /* All YUV-Packed formats, Any new format will be added towards end of this group to maintain
134      backward compatibility.
135   */
136   kFormatYCbCr422H2V1Packed = 0x300,  //!< Y-plane interleaved with horizontally subsampled U/V by
137                                       //!< factor of 2
138                                       //!<    y(0), u(0), y(1), v(0), y(2), u(2), y(3), v(2)
139                                       //!<    y(n-1), u(n-1), y(n), v(n-1)
140 
141   kFormatInvalid = 0xFFFFFFFF,
142 };
143 
144 
145 /*! @brief This enum represents different types of 3D formats supported.
146 
147   @sa LayerBufferS3DFormat
148 */
149 enum LayerBufferS3DFormat {
150   kS3dFormatNone,            //!< Layer buffer content is not 3D content.
151   kS3dFormatLeftRight,       //!< Left and Right view of a 3D content stitched left and right.
152   kS3dFormatRightLeft,       //!< Right and Left view of a 3D content stitched left and right.
153   kS3dFormatTopBottom,       //!< Left and RightView of a 3D content stitched top and bottom.
154   kS3dFormatFramePacking     //!< Left and right view of 3D content coded in consecutive frames.
155 };
156 
157 /*! @brief This structure defines a color sample plane belonging to a buffer format. RGB buffer
158   formats have 1 plane whereas YUV buffer formats may have upto 4 planes.
159 
160   @sa LayerBuffer
161 */
162 struct LayerBufferPlane {
163   int fd = -1;           //!< File descriptor referring to the buffer associated with this plane.
164   uint32_t offset = 0;   //!< Offset of the plane in bytes from beginning of the buffer.
165   uint32_t stride = 0;   //!< Stride in bytes i.e. length of a scanline including padding.
166 };
167 
168 /*! @brief This structure defines flags associated with a layer buffer. The 1-bit flag can be set
169   to ON(1) or OFF(0).
170 
171   @sa LayerBuffer
172 */
173 struct LayerBufferFlags {
174   union {
175     struct {
176       uint32_t secure : 1;          //!< This flag shall be set by client to indicate that the
177                                     //!< buffer need to be handled securely.
178 
179       uint32_t video  : 1;          //!< This flag shall be set by client to indicate that the
180                                     //!< buffer is video/ui buffer.
181 
182       uint32_t macro_tile : 1;      //!< This flag shall be set by client to indicate that the
183                                     //!< buffer format is macro tiled.
184 
185       uint32_t interlace : 1;       //!< This flag shall be set by the client to indicate that
186                                     //!< the buffer has interlaced content.
187 
188       uint32_t secure_display : 1;  //!< This flag shall be set by the client to indicate that the
189                                     //!< secure display session is in progress. Secure display
190                                     //!< session can not coexist with non-secure session.
191     };
192 
193     uint32_t flags = 0;             //!< For initialization purpose only.
194                                     //!< Client shall not refer to it directly.
195   };
196 };
197 
198 /*! @brief This structure defines a layer buffer handle which contains raw buffer and its associated
199   properties.
200 
201   @sa LayerBuffer
202   @sa LayerStack
203 */
204 struct LayerBuffer {
205   uint32_t width = 0;           //!< Actual width of the Layer that this buffer is for.
206   uint32_t height = 0;          //!< Actual height of the Layer that this buffer is for.
207   uint32_t size = 0;            //!< Size of a single buffer (even if multiple clubbed together)
208   LayerBufferFormat format = kFormatRGBA8888;     //!< Format of the buffer content.
209   LayerBufferPlane planes[4];   //!< Array of planes that this buffer contains. RGB buffer formats
210                                 //!< have 1 plane whereas YUV buffer formats may have upto 4 planes.
211                                 //!< Total number of planes for the buffer will be interpreted based
212                                 //!< on the buffer format specified.
213 
214   int acquire_fence_fd = -1;    //!< File descriptor referring to a sync fence object which will be
215                                 //!< signaled when buffer can be read/write by display manager.
216                                 //!< This fence object is set by the client during Commit(). For
217                                 //!< input buffers client shall signal this fence when buffer
218                                 //!< content is available and can be read by display manager. For
219                                 //!< output buffers, client shall signal fence when buffer is ready
220                                 //!< to be written by display manager.
221 
222                                 //!< This field is used only during Commit() and shall be set to -1
223                                 //!< by the client when buffer is already available for read/write.
224 
225   int release_fence_fd = -1;    //!< File descriptor referring to a sync fence object which will be
226                                 //!< signaled when buffer has been read/written by display manager.
227                                 //!< This fence object is set by display manager during Commit().
228                                 //!< For input buffers display manager will signal this fence when
229                                 //!< buffer has been consumed. For output buffers, display manager
230                                 //!< will signal this fence when buffer is produced.
231 
232                                 //!< This field is used only during Commit() and will be set to -1
233                                 //!< by display manager when buffer is already available for
234                                 //!< read/write.
235 
236   LayerBufferFlags flags;       //!< Flags associated with this buffer.
237 
238   LayerBufferS3DFormat s3d_format = kS3dFormatNone;
239                                 //!< Represents the format of the buffer content in 3D.
240   uint64_t buffer_id __attribute__((aligned(8))) = 0;
241                                 //!< Specifies the buffer id.
242 };
243 
244 }  // namespace sdm
245 
246 #endif  // __LAYER_BUFFER_H__
247 
248