| 1 | /* | 
| 2 |  * Copyright © 2011 Intel Corporation | 
| 3 |  * | 
| 4 |  * Permission is hereby granted, free of charge, to any person obtaining a | 
| 5 |  * copy of this software and associated documentation files (the "Software"), | 
| 6 |  * to deal in the Software without restriction, including without limitation | 
| 7 |  * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 
| 8 |  * and/or sell copies of the Software, and to permit persons to whom the | 
| 9 |  * Software is furnished to do so, subject to the following conditions: | 
| 10 |  * | 
| 11 |  * The above copyright notice and this permission notice (including the next | 
| 12 |  * paragraph) shall be included in all copies or substantial portions of the | 
| 13 |  * Software. | 
| 14 |  * | 
| 15 |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 
| 16 |  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
| 17 |  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
| 18 |  * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | 
| 19 |  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | 
| 20 |  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
| 21 |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 
| 22 |  * DEALINGS IN THE SOFTWARE. | 
| 23 |  * | 
| 24 |  * Authors: | 
| 25 |  *    Benjamin Franzke <benjaminfranzke@googlemail.com> | 
| 26 |  */ | 
| 27 |  | 
| 28 | #ifndef _GBM_H_ | 
| 29 | #define _GBM_H_ | 
| 30 |  | 
| 31 | #define __GBM__ 1 | 
| 32 |  | 
| 33 | #include <stddef.h> | 
| 34 | #include <stdint.h> | 
| 35 |  | 
| 36 | #ifdef __cplusplus | 
| 37 | extern "C"  { | 
| 38 | #endif | 
| 39 |  | 
| 40 |  | 
| 41 | /** | 
| 42 |  * \file gbm.h | 
| 43 |  * \brief Generic Buffer Manager | 
| 44 |  */ | 
| 45 |  | 
| 46 | struct gbm_device; | 
| 47 | struct gbm_bo; | 
| 48 | struct gbm_surface; | 
| 49 |  | 
| 50 | /** | 
| 51 |  * \mainpage The Generic Buffer Manager | 
| 52 |  * | 
| 53 |  * This module provides an abstraction that the caller can use to request a | 
| 54 |  * buffer from the underlying memory management system for the platform. | 
| 55 |  * | 
| 56 |  * This allows the creation of portable code whilst still allowing access to | 
| 57 |  * the underlying memory manager. | 
| 58 |  */ | 
| 59 |  | 
| 60 | /** | 
| 61 |  * Abstraction representing the handle to a buffer allocated by the | 
| 62 |  * manager | 
| 63 |  */ | 
| 64 | union gbm_bo_handle { | 
| 65 |    void *ptr; | 
| 66 |    int32_t s32; | 
| 67 |    uint32_t u32; | 
| 68 |    int64_t s64; | 
| 69 |    uint64_t u64; | 
| 70 | }; | 
| 71 |  | 
| 72 | /** Format of the allocated buffer */ | 
| 73 | enum gbm_bo_format { | 
| 74 |    /** RGB with 8 bits per channel in a 32 bit value */ | 
| 75 |    GBM_BO_FORMAT_XRGB8888,  | 
| 76 |    /** ARGB with 8 bits per channel in a 32 bit value */ | 
| 77 |    GBM_BO_FORMAT_ARGB8888 | 
| 78 | }; | 
| 79 |  | 
| 80 |  | 
| 81 | /** | 
| 82 |  * The FourCC format codes are taken from the drm_fourcc.h definition, and | 
| 83 |  * re-namespaced. New GBM formats must not be added, unless they are | 
| 84 |  * identical ports from drm_fourcc. | 
| 85 |  */ | 
| 86 | #define __gbm_fourcc_code(a,b,c,d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \ | 
| 87 | 			      ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24)) | 
| 88 |  | 
| 89 | #define GBM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */ | 
| 90 |  | 
| 91 | /* color index */ | 
| 92 | #define GBM_FORMAT_C8		__gbm_fourcc_code('C', '8', ' ', ' ') /* [7:0] C */ | 
| 93 |  | 
| 94 | /* 8 bpp Red */ | 
| 95 | #define GBM_FORMAT_R8		__gbm_fourcc_code('R', '8', ' ', ' ') /* [7:0] R */ | 
| 96 |  | 
| 97 | /* 16 bpp Red */ | 
| 98 | #define GBM_FORMAT_R16          __gbm_fourcc_code('R', '1', '6', ' ') /* [15:0] R little endian */ | 
| 99 |  | 
| 100 | /* 16 bpp RG */ | 
| 101 | #define GBM_FORMAT_GR88		__gbm_fourcc_code('G', 'R', '8', '8') /* [15:0] G:R 8:8 little endian */ | 
| 102 |  | 
| 103 | /* 32 bpp RG */ | 
| 104 | #define GBM_FORMAT_RG1616	__gbm_fourcc_code('R', 'G', '3', '2') /* [31:0] R:G 16:16 little endian */ | 
| 105 | #define GBM_FORMAT_GR1616	__gbm_fourcc_code('G', 'R', '3', '2') /* [31:0] G:R 16:16 little endian */ | 
| 106 |  | 
| 107 | /* 8 bpp RGB */ | 
| 108 | #define GBM_FORMAT_RGB332	__gbm_fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */ | 
| 109 | #define GBM_FORMAT_BGR233	__gbm_fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */ | 
| 110 |  | 
| 111 | /* 16 bpp RGB */ | 
| 112 | #define GBM_FORMAT_XRGB4444	__gbm_fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */ | 
| 113 | #define GBM_FORMAT_XBGR4444	__gbm_fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */ | 
| 114 | #define GBM_FORMAT_RGBX4444	__gbm_fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */ | 
| 115 | #define GBM_FORMAT_BGRX4444	__gbm_fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */ | 
| 116 |  | 
| 117 | #define GBM_FORMAT_ARGB4444	__gbm_fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */ | 
| 118 | #define GBM_FORMAT_ABGR4444	__gbm_fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */ | 
| 119 | #define GBM_FORMAT_RGBA4444	__gbm_fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */ | 
| 120 | #define GBM_FORMAT_BGRA4444	__gbm_fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */ | 
| 121 |  | 
| 122 | #define GBM_FORMAT_XRGB1555	__gbm_fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */ | 
| 123 | #define GBM_FORMAT_XBGR1555	__gbm_fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */ | 
| 124 | #define GBM_FORMAT_RGBX5551	__gbm_fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */ | 
| 125 | #define GBM_FORMAT_BGRX5551	__gbm_fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */ | 
| 126 |  | 
| 127 | #define GBM_FORMAT_ARGB1555	__gbm_fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */ | 
| 128 | #define GBM_FORMAT_ABGR1555	__gbm_fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */ | 
| 129 | #define GBM_FORMAT_RGBA5551	__gbm_fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */ | 
| 130 | #define GBM_FORMAT_BGRA5551	__gbm_fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */ | 
| 131 |  | 
| 132 | #define GBM_FORMAT_RGB565	__gbm_fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */ | 
| 133 | #define GBM_FORMAT_BGR565	__gbm_fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */ | 
| 134 |  | 
| 135 | /* 24 bpp RGB */ | 
| 136 | #define GBM_FORMAT_RGB888	__gbm_fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */ | 
| 137 | #define GBM_FORMAT_BGR888	__gbm_fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */ | 
| 138 |  | 
| 139 | /* 32 bpp RGB */ | 
| 140 | #define GBM_FORMAT_XRGB8888	__gbm_fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */ | 
| 141 | #define GBM_FORMAT_XBGR8888	__gbm_fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */ | 
| 142 | #define GBM_FORMAT_RGBX8888	__gbm_fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */ | 
| 143 | #define GBM_FORMAT_BGRX8888	__gbm_fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */ | 
| 144 |  | 
| 145 | #define GBM_FORMAT_ARGB8888	__gbm_fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */ | 
| 146 | #define GBM_FORMAT_ABGR8888	__gbm_fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */ | 
| 147 | #define GBM_FORMAT_RGBA8888	__gbm_fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */ | 
| 148 | #define GBM_FORMAT_BGRA8888	__gbm_fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */ | 
| 149 |  | 
| 150 | #define GBM_FORMAT_XRGB2101010	__gbm_fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */ | 
| 151 | #define GBM_FORMAT_XBGR2101010	__gbm_fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */ | 
| 152 | #define GBM_FORMAT_RGBX1010102	__gbm_fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */ | 
| 153 | #define GBM_FORMAT_BGRX1010102	__gbm_fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */ | 
| 154 |  | 
| 155 | #define GBM_FORMAT_ARGB2101010	__gbm_fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */ | 
| 156 | #define GBM_FORMAT_ABGR2101010	__gbm_fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */ | 
| 157 | #define GBM_FORMAT_RGBA1010102	__gbm_fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */ | 
| 158 | #define GBM_FORMAT_BGRA1010102	__gbm_fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */ | 
| 159 |  | 
| 160 | /* 64 bpp RGB */ | 
| 161 | #define GBM_FORMAT_XBGR16161616	__gbm_fourcc_code('X', 'B', '4', '8') /* [63:0] x:B:G:R 16:16:16:16 little endian */ | 
| 162 |  | 
| 163 | #define GBM_FORMAT_ABGR16161616	__gbm_fourcc_code('A', 'B', '4', '8') /* [63:0] A:B:G:R 16:16:16:16 little endian */ | 
| 164 |  | 
| 165 | /* | 
| 166 |  * Floating point 64bpp RGB | 
| 167 |  * IEEE 754-2008 binary16 half-precision float | 
| 168 |  * [15:0] sign:exponent:mantissa 1:5:10 | 
| 169 |  */ | 
| 170 | #define GBM_FORMAT_XBGR16161616F __gbm_fourcc_code('X', 'B', '4', 'H') /* [63:0] x:B:G:R 16:16:16:16 little endian */ | 
| 171 |  | 
| 172 | #define GBM_FORMAT_ABGR16161616F __gbm_fourcc_code('A', 'B', '4', 'H') /* [63:0] A:B:G:R 16:16:16:16 little endian */ | 
| 173 |  | 
| 174 | /* packed YCbCr */ | 
| 175 | #define GBM_FORMAT_YUYV		__gbm_fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */ | 
| 176 | #define GBM_FORMAT_YVYU		__gbm_fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */ | 
| 177 | #define GBM_FORMAT_UYVY		__gbm_fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */ | 
| 178 | #define GBM_FORMAT_VYUY		__gbm_fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ | 
| 179 |  | 
| 180 | #define GBM_FORMAT_AYUV		__gbm_fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ | 
| 181 |  | 
| 182 | /* | 
| 183 |  * 2 plane YCbCr | 
| 184 |  * index 0 = Y plane, [7:0] Y | 
| 185 |  * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian | 
| 186 |  * or | 
| 187 |  * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian | 
| 188 |  */ | 
| 189 | #define GBM_FORMAT_NV12		__gbm_fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */ | 
| 190 | #define GBM_FORMAT_NV21		__gbm_fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */ | 
| 191 | #define GBM_FORMAT_NV16		__gbm_fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */ | 
| 192 | #define GBM_FORMAT_NV61		__gbm_fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */ | 
| 193 |  | 
| 194 | /* | 
| 195 |  * 3 plane YCbCr | 
| 196 |  * index 0: Y plane, [7:0] Y | 
| 197 |  * index 1: Cb plane, [7:0] Cb | 
| 198 |  * index 2: Cr plane, [7:0] Cr | 
| 199 |  * or | 
| 200 |  * index 1: Cr plane, [7:0] Cr | 
| 201 |  * index 2: Cb plane, [7:0] Cb | 
| 202 |  */ | 
| 203 | #define GBM_FORMAT_YUV410	__gbm_fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */ | 
| 204 | #define GBM_FORMAT_YVU410	__gbm_fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */ | 
| 205 | #define GBM_FORMAT_YUV411	__gbm_fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */ | 
| 206 | #define GBM_FORMAT_YVU411	__gbm_fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */ | 
| 207 | #define GBM_FORMAT_YUV420	__gbm_fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */ | 
| 208 | #define GBM_FORMAT_YVU420	__gbm_fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */ | 
| 209 | #define GBM_FORMAT_YUV422	__gbm_fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */ | 
| 210 | #define GBM_FORMAT_YVU422	__gbm_fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */ | 
| 211 | #define GBM_FORMAT_YUV444	__gbm_fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */ | 
| 212 | #define GBM_FORMAT_YVU444	__gbm_fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */ | 
| 213 |  | 
| 214 | struct gbm_format_name_desc { | 
| 215 |    char name[5]; | 
| 216 | }; | 
| 217 |  | 
| 218 | /** | 
| 219 |  * Flags to indicate the intended use for the buffer - these are passed into | 
| 220 |  * gbm_bo_create(). The caller must set the union of all the flags that are | 
| 221 |  * appropriate | 
| 222 |  * | 
| 223 |  * \sa Use gbm_device_is_format_supported() to check if the combination of format | 
| 224 |  * and use flags are supported | 
| 225 |  */ | 
| 226 | enum gbm_bo_flags { | 
| 227 |    /** | 
| 228 |     * Buffer is going to be presented to the screen using an API such as KMS | 
| 229 |     */ | 
| 230 |    GBM_BO_USE_SCANOUT      = (1 << 0), | 
| 231 |    /** | 
| 232 |     * Buffer is going to be used as cursor | 
| 233 |     */ | 
| 234 |    GBM_BO_USE_CURSOR       = (1 << 1), | 
| 235 |    /** | 
| 236 |     * Deprecated | 
| 237 |     */ | 
| 238 |    GBM_BO_USE_CURSOR_64X64 = GBM_BO_USE_CURSOR, | 
| 239 |    /** | 
| 240 |     * Buffer is to be used for rendering - for example it is going to be used | 
| 241 |     * as the storage for a color buffer | 
| 242 |     */ | 
| 243 |    GBM_BO_USE_RENDERING    = (1 << 2), | 
| 244 |    /** | 
| 245 |     * Buffer can be used for gbm_bo_write.  This is guaranteed to work | 
| 246 |     * with GBM_BO_USE_CURSOR, but may not work for other combinations. | 
| 247 |     */ | 
| 248 |    GBM_BO_USE_WRITE    = (1 << 3), | 
| 249 |    /** | 
| 250 |     * Buffer is linear, i.e. not tiled. | 
| 251 |     */ | 
| 252 |    GBM_BO_USE_LINEAR = (1 << 4), | 
| 253 |    /** | 
| 254 |     * Buffer is protected, i.e. encrypted and not readable by CPU or any | 
| 255 |     * other non-secure / non-trusted components nor by non-trusted OpenGL, | 
| 256 |     * OpenCL, and Vulkan applications. | 
| 257 |     */ | 
| 258 |    GBM_BO_USE_PROTECTED = (1 << 5), | 
| 259 |  | 
| 260 |    /** | 
| 261 |     * The buffer will be used for front buffer rendering.  On some | 
| 262 |     * platforms this may (for example) disable framebuffer compression | 
| 263 |     * to avoid problems with compression flags data being out of sync | 
| 264 |     * with pixel data. | 
| 265 |     */ | 
| 266 |    GBM_BO_USE_FRONT_RENDERING = (1 << 6), | 
| 267 | }; | 
| 268 |  | 
| 269 | int | 
| 270 | gbm_device_get_fd(struct gbm_device *gbm); | 
| 271 |  | 
| 272 | const char * | 
| 273 | gbm_device_get_backend_name(struct gbm_device *gbm); | 
| 274 |  | 
| 275 | int | 
| 276 | gbm_device_is_format_supported(struct gbm_device *gbm, | 
| 277 |                                uint32_t format, uint32_t flags); | 
| 278 |  | 
| 279 | int | 
| 280 | gbm_device_get_format_modifier_plane_count(struct gbm_device *gbm, | 
| 281 |                                            uint32_t format, | 
| 282 |                                            uint64_t modifier); | 
| 283 |  | 
| 284 | void | 
| 285 | gbm_device_destroy(struct gbm_device *gbm); | 
| 286 |  | 
| 287 | struct gbm_device * | 
| 288 | gbm_create_device(int fd); | 
| 289 |  | 
| 290 | struct gbm_bo * | 
| 291 | gbm_bo_create(struct gbm_device *gbm, | 
| 292 |               uint32_t width, uint32_t height, | 
| 293 |               uint32_t format, uint32_t flags); | 
| 294 |  | 
| 295 | struct gbm_bo * | 
| 296 | gbm_bo_create_with_modifiers(struct gbm_device *gbm, | 
| 297 |                              uint32_t width, uint32_t height, | 
| 298 |                              uint32_t format, | 
| 299 |                              const uint64_t *modifiers, | 
| 300 |                              const unsigned int count); | 
| 301 |  | 
| 302 | struct gbm_bo * | 
| 303 | gbm_bo_create_with_modifiers2(struct gbm_device *gbm, | 
| 304 |                               uint32_t width, uint32_t height, | 
| 305 |                               uint32_t format, | 
| 306 |                               const uint64_t *modifiers, | 
| 307 |                               const unsigned int count, | 
| 308 |                               uint32_t flags); | 
| 309 |  | 
| 310 | #define GBM_BO_IMPORT_WL_BUFFER         0x5501 | 
| 311 | #define GBM_BO_IMPORT_EGL_IMAGE         0x5502 | 
| 312 | #define GBM_BO_IMPORT_FD                0x5503 | 
| 313 | #define GBM_BO_IMPORT_FD_MODIFIER       0x5504 | 
| 314 |  | 
| 315 | struct gbm_import_fd_data { | 
| 316 |    int fd; | 
| 317 |    uint32_t width; | 
| 318 |    uint32_t height; | 
| 319 |    uint32_t stride; | 
| 320 |    uint32_t format; | 
| 321 | }; | 
| 322 |  | 
| 323 | #define GBM_MAX_PLANES 4 | 
| 324 |  | 
| 325 | struct gbm_import_fd_modifier_data { | 
| 326 |    uint32_t width; | 
| 327 |    uint32_t height; | 
| 328 |    uint32_t format; | 
| 329 |    uint32_t num_fds; | 
| 330 |    int fds[GBM_MAX_PLANES]; | 
| 331 |    int strides[GBM_MAX_PLANES]; | 
| 332 |    int offsets[GBM_MAX_PLANES]; | 
| 333 |    uint64_t modifier; | 
| 334 | }; | 
| 335 |  | 
| 336 | struct gbm_bo * | 
| 337 | gbm_bo_import(struct gbm_device *gbm, uint32_t type, | 
| 338 |               void *buffer, uint32_t flags); | 
| 339 |  | 
| 340 | /** | 
| 341 |  * Flags to indicate the type of mapping for the buffer - these are | 
| 342 |  * passed into gbm_bo_map(). The caller must set the union of all the | 
| 343 |  * flags that are appropriate. | 
| 344 |  * | 
| 345 |  * These flags are independent of the GBM_BO_USE_* creation flags. However, | 
| 346 |  * mapping the buffer may require copying to/from a staging buffer. | 
| 347 |  * | 
| 348 |  * See also: pipe_map_flags | 
| 349 |  */ | 
| 350 | enum gbm_bo_transfer_flags { | 
| 351 |    /** | 
| 352 |     * Buffer contents read back (or accessed directly) at transfer | 
| 353 |     * create time. | 
| 354 |     */ | 
| 355 |    GBM_BO_TRANSFER_READ       = (1 << 0), | 
| 356 |    /** | 
| 357 |     * Buffer contents will be written back at unmap time | 
| 358 |     * (or modified as a result of being accessed directly). | 
| 359 |     */ | 
| 360 |    GBM_BO_TRANSFER_WRITE      = (1 << 1), | 
| 361 |    /** | 
| 362 |     * Read/modify/write | 
| 363 |     */ | 
| 364 |    GBM_BO_TRANSFER_READ_WRITE = (GBM_BO_TRANSFER_READ | GBM_BO_TRANSFER_WRITE), | 
| 365 | }; | 
| 366 |  | 
| 367 | void * | 
| 368 | gbm_bo_map(struct gbm_bo *bo, | 
| 369 |            uint32_t x, uint32_t y, uint32_t width, uint32_t height, | 
| 370 |            uint32_t flags, uint32_t *stride, void **map_data); | 
| 371 |  | 
| 372 | void | 
| 373 | gbm_bo_unmap(struct gbm_bo *bo, void *map_data); | 
| 374 |  | 
| 375 | uint32_t | 
| 376 | gbm_bo_get_width(struct gbm_bo *bo); | 
| 377 |  | 
| 378 | uint32_t | 
| 379 | gbm_bo_get_height(struct gbm_bo *bo); | 
| 380 |  | 
| 381 | uint32_t | 
| 382 | gbm_bo_get_stride(struct gbm_bo *bo); | 
| 383 |  | 
| 384 | uint32_t | 
| 385 | gbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane); | 
| 386 |  | 
| 387 | uint32_t | 
| 388 | gbm_bo_get_format(struct gbm_bo *bo); | 
| 389 |  | 
| 390 | uint32_t | 
| 391 | gbm_bo_get_bpp(struct gbm_bo *bo); | 
| 392 |  | 
| 393 | uint32_t | 
| 394 | gbm_bo_get_offset(struct gbm_bo *bo, int plane); | 
| 395 |  | 
| 396 | struct gbm_device * | 
| 397 | gbm_bo_get_device(struct gbm_bo *bo); | 
| 398 |  | 
| 399 | union gbm_bo_handle | 
| 400 | gbm_bo_get_handle(struct gbm_bo *bo); | 
| 401 |  | 
| 402 | int | 
| 403 | gbm_bo_get_fd(struct gbm_bo *bo); | 
| 404 |  | 
| 405 | uint64_t | 
| 406 | gbm_bo_get_modifier(struct gbm_bo *bo); | 
| 407 |  | 
| 408 | int | 
| 409 | gbm_bo_get_plane_count(struct gbm_bo *bo); | 
| 410 |  | 
| 411 | union gbm_bo_handle | 
| 412 | gbm_bo_get_handle_for_plane(struct gbm_bo *bo, int plane); | 
| 413 |  | 
| 414 | int | 
| 415 | gbm_bo_get_fd_for_plane(struct gbm_bo *bo, int plane); | 
| 416 |  | 
| 417 | int | 
| 418 | gbm_bo_write(struct gbm_bo *bo, const void *buf, size_t count); | 
| 419 |  | 
| 420 | void | 
| 421 | gbm_bo_set_user_data(struct gbm_bo *bo, void *data, | 
| 422 | 		     void (*destroy_user_data)(struct gbm_bo *, void *)); | 
| 423 |  | 
| 424 | void * | 
| 425 | gbm_bo_get_user_data(struct gbm_bo *bo); | 
| 426 |  | 
| 427 | void | 
| 428 | gbm_bo_destroy(struct gbm_bo *bo); | 
| 429 |  | 
| 430 | struct gbm_surface * | 
| 431 | gbm_surface_create(struct gbm_device *gbm, | 
| 432 |                    uint32_t width, uint32_t height, | 
| 433 | 		   uint32_t format, uint32_t flags); | 
| 434 |  | 
| 435 | struct gbm_surface * | 
| 436 | gbm_surface_create_with_modifiers(struct gbm_device *gbm, | 
| 437 |                                   uint32_t width, uint32_t height, | 
| 438 |                                   uint32_t format, | 
| 439 |                                   const uint64_t *modifiers, | 
| 440 |                                   const unsigned int count); | 
| 441 |  | 
| 442 | struct gbm_surface * | 
| 443 | gbm_surface_create_with_modifiers2(struct gbm_device *gbm, | 
| 444 |                                    uint32_t width, uint32_t height, | 
| 445 |                                    uint32_t format, | 
| 446 |                                    const uint64_t *modifiers, | 
| 447 |                                    const unsigned int count, | 
| 448 |                                    uint32_t flags); | 
| 449 |  | 
| 450 | struct gbm_bo * | 
| 451 | gbm_surface_lock_front_buffer(struct gbm_surface *surface); | 
| 452 |  | 
| 453 | void | 
| 454 | gbm_surface_release_buffer(struct gbm_surface *surface, struct gbm_bo *bo); | 
| 455 |  | 
| 456 | int | 
| 457 | gbm_surface_has_free_buffers(struct gbm_surface *surface); | 
| 458 |  | 
| 459 | void | 
| 460 | gbm_surface_destroy(struct gbm_surface *surface); | 
| 461 |  | 
| 462 | char * | 
| 463 | gbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc); | 
| 464 |  | 
| 465 | #ifdef __cplusplus | 
| 466 | } | 
| 467 | #endif | 
| 468 |  | 
| 469 | #endif | 
| 470 |  |