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