13464ebd5Sriastradh/*
23464ebd5Sriastradh * Copyright © 2011 Intel Corporation
33464ebd5Sriastradh *
43464ebd5Sriastradh * Permission is hereby granted, free of charge, to any person obtaining a
53464ebd5Sriastradh * copy of this software and associated documentation files (the "Software"),
63464ebd5Sriastradh * to deal in the Software without restriction, including without limitation
73464ebd5Sriastradh * the rights to use, copy, modify, merge, publish, distribute, sublicense,
83464ebd5Sriastradh * and/or sell copies of the Software, and to permit persons to whom the
93464ebd5Sriastradh * Software is furnished to do so, subject to the following conditions:
103464ebd5Sriastradh *
113464ebd5Sriastradh * The above copyright notice and this permission notice (including the next
123464ebd5Sriastradh * paragraph) shall be included in all copies or substantial portions of the
133464ebd5Sriastradh * Software.
143464ebd5Sriastradh *
153464ebd5Sriastradh * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
163464ebd5Sriastradh * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
173464ebd5Sriastradh * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
183464ebd5Sriastradh * NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
193464ebd5Sriastradh * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
203464ebd5Sriastradh * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
213464ebd5Sriastradh * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
223464ebd5Sriastradh * DEALINGS IN THE SOFTWARE.
233464ebd5Sriastradh *
243464ebd5Sriastradh * Authors:
253464ebd5Sriastradh *    Benjamin Franzke <benjaminfranzke@googlemail.com>
263464ebd5Sriastradh */
273464ebd5Sriastradh
283464ebd5Sriastradh#ifndef _GBM_H_
293464ebd5Sriastradh#define _GBM_H_
303464ebd5Sriastradh
3101e04c3fSmrg#define __GBM__ 1
3201e04c3fSmrg
3301e04c3fSmrg#include <stddef.h>
3401e04c3fSmrg#include <stdint.h>
3501e04c3fSmrg
363464ebd5Sriastradh#ifdef __cplusplus
373464ebd5Sriastradhextern "C" {
383464ebd5Sriastradh#endif
393464ebd5Sriastradh
403464ebd5Sriastradh
41af69d88dSmrg/**
42af69d88dSmrg * \file gbm.h
43af69d88dSmrg * \brief Generic Buffer Manager
44af69d88dSmrg */
45af69d88dSmrg
463464ebd5Sriastradhstruct gbm_device;
473464ebd5Sriastradhstruct gbm_bo;
48af69d88dSmrgstruct gbm_surface;
49af69d88dSmrg
50af69d88dSmrg/**
51af69d88dSmrg * \mainpage The Generic Buffer Manager
52af69d88dSmrg *
53af69d88dSmrg * This module provides an abstraction that the caller can use to request a
54af69d88dSmrg * buffer from the underlying memory management system for the platform.
55af69d88dSmrg *
56af69d88dSmrg * This allows the creation of portable code whilst still allowing access to
57af69d88dSmrg * the underlying memory manager.
58af69d88dSmrg */
593464ebd5Sriastradh
60af69d88dSmrg/**
61af69d88dSmrg * Abstraction representing the handle to a buffer allocated by the
62af69d88dSmrg * manager
63af69d88dSmrg */
643464ebd5Sriastradhunion gbm_bo_handle {
653464ebd5Sriastradh   void *ptr;
663464ebd5Sriastradh   int32_t s32;
673464ebd5Sriastradh   uint32_t u32;
683464ebd5Sriastradh   int64_t s64;
693464ebd5Sriastradh   uint64_t u64;
703464ebd5Sriastradh};
713464ebd5Sriastradh
72af69d88dSmrg/** Format of the allocated buffer */
733464ebd5Sriastradhenum gbm_bo_format {
74af69d88dSmrg   /** RGB with 8 bits per channel in a 32 bit value */
75af69d88dSmrg   GBM_BO_FORMAT_XRGB8888,
76af69d88dSmrg   /** ARGB with 8 bits per channel in a 32 bit value */
77af69d88dSmrg   GBM_BO_FORMAT_ARGB8888
783464ebd5Sriastradh};
793464ebd5Sriastradh
8001e04c3fSmrg
8101e04c3fSmrg/**
8201e04c3fSmrg * The FourCC format codes are taken from the drm_fourcc.h definition, and
8301e04c3fSmrg * re-namespaced. New GBM formats must not be added, unless they are
8401e04c3fSmrg * identical ports from drm_fourcc.
8501e04c3fSmrg */
86af69d88dSmrg#define __gbm_fourcc_code(a,b,c,d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \
87af69d88dSmrg			      ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24))
88af69d88dSmrg
89af69d88dSmrg#define GBM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */
90af69d88dSmrg
91af69d88dSmrg/* color index */
92af69d88dSmrg#define GBM_FORMAT_C8		__gbm_fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
93af69d88dSmrg
9401e04c3fSmrg/* 8 bpp Red */
9501e04c3fSmrg#define GBM_FORMAT_R8		__gbm_fourcc_code('R', '8', ' ', ' ') /* [7:0] R */
9601e04c3fSmrg
977ec681f3Smrg/* 16 bpp Red */
987ec681f3Smrg#define GBM_FORMAT_R16          __gbm_fourcc_code('R', '1', '6', ' ') /* [15:0] R little endian */
997ec681f3Smrg
10001e04c3fSmrg/* 16 bpp RG */
10101e04c3fSmrg#define GBM_FORMAT_GR88		__gbm_fourcc_code('G', 'R', '8', '8') /* [15:0] G:R 8:8 little endian */
10201e04c3fSmrg
103af69d88dSmrg/* 8 bpp RGB */
104af69d88dSmrg#define GBM_FORMAT_RGB332	__gbm_fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */
105af69d88dSmrg#define GBM_FORMAT_BGR233	__gbm_fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */
106af69d88dSmrg
107af69d88dSmrg/* 16 bpp RGB */
108af69d88dSmrg#define GBM_FORMAT_XRGB4444	__gbm_fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */
109af69d88dSmrg#define GBM_FORMAT_XBGR4444	__gbm_fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */
110af69d88dSmrg#define GBM_FORMAT_RGBX4444	__gbm_fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */
111af69d88dSmrg#define GBM_FORMAT_BGRX4444	__gbm_fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */
112af69d88dSmrg
113af69d88dSmrg#define GBM_FORMAT_ARGB4444	__gbm_fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */
114af69d88dSmrg#define GBM_FORMAT_ABGR4444	__gbm_fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */
115af69d88dSmrg#define GBM_FORMAT_RGBA4444	__gbm_fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */
116af69d88dSmrg#define GBM_FORMAT_BGRA4444	__gbm_fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */
117af69d88dSmrg
118af69d88dSmrg#define GBM_FORMAT_XRGB1555	__gbm_fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */
119af69d88dSmrg#define GBM_FORMAT_XBGR1555	__gbm_fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */
120af69d88dSmrg#define GBM_FORMAT_RGBX5551	__gbm_fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */
121af69d88dSmrg#define GBM_FORMAT_BGRX5551	__gbm_fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */
122af69d88dSmrg
123af69d88dSmrg#define GBM_FORMAT_ARGB1555	__gbm_fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */
124af69d88dSmrg#define GBM_FORMAT_ABGR1555	__gbm_fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */
125af69d88dSmrg#define GBM_FORMAT_RGBA5551	__gbm_fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */
126af69d88dSmrg#define GBM_FORMAT_BGRA5551	__gbm_fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */
127af69d88dSmrg
128af69d88dSmrg#define GBM_FORMAT_RGB565	__gbm_fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */
129af69d88dSmrg#define GBM_FORMAT_BGR565	__gbm_fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */
130af69d88dSmrg
131af69d88dSmrg/* 24 bpp RGB */
132af69d88dSmrg#define GBM_FORMAT_RGB888	__gbm_fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */
133af69d88dSmrg#define GBM_FORMAT_BGR888	__gbm_fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */
134af69d88dSmrg
135af69d88dSmrg/* 32 bpp RGB */
136af69d88dSmrg#define GBM_FORMAT_XRGB8888	__gbm_fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */
137af69d88dSmrg#define GBM_FORMAT_XBGR8888	__gbm_fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */
138af69d88dSmrg#define GBM_FORMAT_RGBX8888	__gbm_fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */
139af69d88dSmrg#define GBM_FORMAT_BGRX8888	__gbm_fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */
140af69d88dSmrg
141af69d88dSmrg#define GBM_FORMAT_ARGB8888	__gbm_fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */
142af69d88dSmrg#define GBM_FORMAT_ABGR8888	__gbm_fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */
143af69d88dSmrg#define GBM_FORMAT_RGBA8888	__gbm_fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */
144af69d88dSmrg#define GBM_FORMAT_BGRA8888	__gbm_fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */
145af69d88dSmrg
146af69d88dSmrg#define GBM_FORMAT_XRGB2101010	__gbm_fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */
147af69d88dSmrg#define GBM_FORMAT_XBGR2101010	__gbm_fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */
148af69d88dSmrg#define GBM_FORMAT_RGBX1010102	__gbm_fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */
149af69d88dSmrg#define GBM_FORMAT_BGRX1010102	__gbm_fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */
150af69d88dSmrg
151af69d88dSmrg#define GBM_FORMAT_ARGB2101010	__gbm_fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */
152af69d88dSmrg#define GBM_FORMAT_ABGR2101010	__gbm_fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */
153af69d88dSmrg#define GBM_FORMAT_RGBA1010102	__gbm_fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */
154af69d88dSmrg#define GBM_FORMAT_BGRA1010102	__gbm_fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */
155af69d88dSmrg
1567ec681f3Smrg/*
1577ec681f3Smrg * Floating point 64bpp RGB
1587ec681f3Smrg * IEEE 754-2008 binary16 half-precision float
1597ec681f3Smrg * [15:0] sign:exponent:mantissa 1:5:10
1607ec681f3Smrg */
1617ec681f3Smrg#define GBM_FORMAT_XBGR16161616F __gbm_fourcc_code('X', 'B', '4', 'H') /* [63:0] x:B:G:R 16:16:16:16 little endian */
1627ec681f3Smrg
1637ec681f3Smrg#define GBM_FORMAT_ABGR16161616F __gbm_fourcc_code('A', 'B', '4', 'H') /* [63:0] A:B:G:R 16:16:16:16 little endian */
1647ec681f3Smrg
165af69d88dSmrg/* packed YCbCr */
166af69d88dSmrg#define GBM_FORMAT_YUYV		__gbm_fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */
167af69d88dSmrg#define GBM_FORMAT_YVYU		__gbm_fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */
168af69d88dSmrg#define GBM_FORMAT_UYVY		__gbm_fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */
169af69d88dSmrg#define GBM_FORMAT_VYUY		__gbm_fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
170af69d88dSmrg
171af69d88dSmrg#define GBM_FORMAT_AYUV		__gbm_fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
172af69d88dSmrg
173af69d88dSmrg/*
174af69d88dSmrg * 2 plane YCbCr
175af69d88dSmrg * index 0 = Y plane, [7:0] Y
176af69d88dSmrg * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian
177af69d88dSmrg * or
178af69d88dSmrg * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian
179af69d88dSmrg */
180af69d88dSmrg#define GBM_FORMAT_NV12		__gbm_fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */
181af69d88dSmrg#define GBM_FORMAT_NV21		__gbm_fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */
182af69d88dSmrg#define GBM_FORMAT_NV16		__gbm_fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */
183af69d88dSmrg#define GBM_FORMAT_NV61		__gbm_fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
184af69d88dSmrg
185af69d88dSmrg/*
186af69d88dSmrg * 3 plane YCbCr
187af69d88dSmrg * index 0: Y plane, [7:0] Y
188af69d88dSmrg * index 1: Cb plane, [7:0] Cb
189af69d88dSmrg * index 2: Cr plane, [7:0] Cr
190af69d88dSmrg * or
191af69d88dSmrg * index 1: Cr plane, [7:0] Cr
192af69d88dSmrg * index 2: Cb plane, [7:0] Cb
193af69d88dSmrg */
194af69d88dSmrg#define GBM_FORMAT_YUV410	__gbm_fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */
195af69d88dSmrg#define GBM_FORMAT_YVU410	__gbm_fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */
196af69d88dSmrg#define GBM_FORMAT_YUV411	__gbm_fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */
197af69d88dSmrg#define GBM_FORMAT_YVU411	__gbm_fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */
198af69d88dSmrg#define GBM_FORMAT_YUV420	__gbm_fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */
199af69d88dSmrg#define GBM_FORMAT_YVU420	__gbm_fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */
200af69d88dSmrg#define GBM_FORMAT_YUV422	__gbm_fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */
201af69d88dSmrg#define GBM_FORMAT_YVU422	__gbm_fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */
202af69d88dSmrg#define GBM_FORMAT_YUV444	__gbm_fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
203af69d88dSmrg#define GBM_FORMAT_YVU444	__gbm_fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
204af69d88dSmrg
2059f464c52Smayastruct gbm_format_name_desc {
2069f464c52Smaya   char name[5];
2079f464c52Smaya};
208af69d88dSmrg
209af69d88dSmrg/**
210af69d88dSmrg * Flags to indicate the intended use for the buffer - these are passed into
211af69d88dSmrg * gbm_bo_create(). The caller must set the union of all the flags that are
212af69d88dSmrg * appropriate
213af69d88dSmrg *
214af69d88dSmrg * \sa Use gbm_device_is_format_supported() to check if the combination of format
215af69d88dSmrg * and use flags are supported
216af69d88dSmrg */
2173464ebd5Sriastradhenum gbm_bo_flags {
218af69d88dSmrg   /**
219af69d88dSmrg    * Buffer is going to be presented to the screen using an API such as KMS
220af69d88dSmrg    */
2213464ebd5Sriastradh   GBM_BO_USE_SCANOUT      = (1 << 0),
222af69d88dSmrg   /**
223af69d88dSmrg    * Buffer is going to be used as cursor
224af69d88dSmrg    */
225af69d88dSmrg   GBM_BO_USE_CURSOR       = (1 << 1),
226af69d88dSmrg   /**
227af69d88dSmrg    * Deprecated
228af69d88dSmrg    */
229af69d88dSmrg   GBM_BO_USE_CURSOR_64X64 = GBM_BO_USE_CURSOR,
230af69d88dSmrg   /**
231af69d88dSmrg    * Buffer is to be used for rendering - for example it is going to be used
232af69d88dSmrg    * as the storage for a color buffer
233af69d88dSmrg    */
2343464ebd5Sriastradh   GBM_BO_USE_RENDERING    = (1 << 2),
235af69d88dSmrg   /**
236af69d88dSmrg    * Buffer can be used for gbm_bo_write.  This is guaranteed to work
23701e04c3fSmrg    * with GBM_BO_USE_CURSOR, but may not work for other combinations.
238af69d88dSmrg    */
239af69d88dSmrg   GBM_BO_USE_WRITE    = (1 << 3),
24001e04c3fSmrg   /**
24101e04c3fSmrg    * Buffer is linear, i.e. not tiled.
24201e04c3fSmrg    */
24301e04c3fSmrg   GBM_BO_USE_LINEAR = (1 << 4),
2447ec681f3Smrg   /**
2457ec681f3Smrg    * Buffer is protected, i.e. encrypted and not readable by CPU or any
2467ec681f3Smrg    * other non-secure / non-trusted components nor by non-trusted OpenGL,
2477ec681f3Smrg    * OpenCL, and Vulkan applications.
2487ec681f3Smrg    */
2497ec681f3Smrg   GBM_BO_USE_PROTECTED = (1 << 5),
2503464ebd5Sriastradh};
2513464ebd5Sriastradh
2523464ebd5Sriastradhint
2533464ebd5Sriastradhgbm_device_get_fd(struct gbm_device *gbm);
2543464ebd5Sriastradh
2553464ebd5Sriastradhconst char *
2563464ebd5Sriastradhgbm_device_get_backend_name(struct gbm_device *gbm);
2573464ebd5Sriastradh
2583464ebd5Sriastradhint
2593464ebd5Sriastradhgbm_device_is_format_supported(struct gbm_device *gbm,
2607ec681f3Smrg                               uint32_t format, uint32_t flags);
2613464ebd5Sriastradh
26201e04c3fSmrgint
26301e04c3fSmrggbm_device_get_format_modifier_plane_count(struct gbm_device *gbm,
26401e04c3fSmrg                                           uint32_t format,
26501e04c3fSmrg                                           uint64_t modifier);
26601e04c3fSmrg
2673464ebd5Sriastradhvoid
2683464ebd5Sriastradhgbm_device_destroy(struct gbm_device *gbm);
2693464ebd5Sriastradh
2703464ebd5Sriastradhstruct gbm_device *
2713464ebd5Sriastradhgbm_create_device(int fd);
2723464ebd5Sriastradh
2733464ebd5Sriastradhstruct gbm_bo *
2743464ebd5Sriastradhgbm_bo_create(struct gbm_device *gbm,
2753464ebd5Sriastradh              uint32_t width, uint32_t height,
276af69d88dSmrg              uint32_t format, uint32_t flags);
277af69d88dSmrg
27801e04c3fSmrgstruct gbm_bo *
27901e04c3fSmrggbm_bo_create_with_modifiers(struct gbm_device *gbm,
28001e04c3fSmrg                             uint32_t width, uint32_t height,
28101e04c3fSmrg                             uint32_t format,
28201e04c3fSmrg                             const uint64_t *modifiers,
28301e04c3fSmrg                             const unsigned int count);
2847ec681f3Smrg
2857ec681f3Smrgstruct gbm_bo *
2867ec681f3Smrggbm_bo_create_with_modifiers2(struct gbm_device *gbm,
2877ec681f3Smrg                              uint32_t width, uint32_t height,
2887ec681f3Smrg                              uint32_t format,
2897ec681f3Smrg                              const uint64_t *modifiers,
2907ec681f3Smrg                              const unsigned int count,
2917ec681f3Smrg                              uint32_t flags);
2927ec681f3Smrg
293af69d88dSmrg#define GBM_BO_IMPORT_WL_BUFFER         0x5501
294af69d88dSmrg#define GBM_BO_IMPORT_EGL_IMAGE         0x5502
295af69d88dSmrg#define GBM_BO_IMPORT_FD                0x5503
29601e04c3fSmrg#define GBM_BO_IMPORT_FD_MODIFIER       0x5504
297af69d88dSmrg
298af69d88dSmrgstruct gbm_import_fd_data {
299af69d88dSmrg   int fd;
300af69d88dSmrg   uint32_t width;
301af69d88dSmrg   uint32_t height;
302af69d88dSmrg   uint32_t stride;
303af69d88dSmrg   uint32_t format;
304af69d88dSmrg};
3053464ebd5Sriastradh
3067ec681f3Smrg#define GBM_MAX_PLANES 4
3077ec681f3Smrg
30801e04c3fSmrgstruct gbm_import_fd_modifier_data {
30901e04c3fSmrg   uint32_t width;
31001e04c3fSmrg   uint32_t height;
31101e04c3fSmrg   uint32_t format;
31201e04c3fSmrg   uint32_t num_fds;
3137ec681f3Smrg   int fds[GBM_MAX_PLANES];
3147ec681f3Smrg   int strides[GBM_MAX_PLANES];
3157ec681f3Smrg   int offsets[GBM_MAX_PLANES];
31601e04c3fSmrg   uint64_t modifier;
31701e04c3fSmrg};
31801e04c3fSmrg
3193464ebd5Sriastradhstruct gbm_bo *
320af69d88dSmrggbm_bo_import(struct gbm_device *gbm, uint32_t type,
3217ec681f3Smrg              void *buffer, uint32_t flags);
3223464ebd5Sriastradh
32301e04c3fSmrg/**
32401e04c3fSmrg * Flags to indicate the type of mapping for the buffer - these are
32501e04c3fSmrg * passed into gbm_bo_map(). The caller must set the union of all the
32601e04c3fSmrg * flags that are appropriate.
32701e04c3fSmrg *
32801e04c3fSmrg * These flags are independent of the GBM_BO_USE_* creation flags. However,
32901e04c3fSmrg * mapping the buffer may require copying to/from a staging buffer.
33001e04c3fSmrg *
3317ec681f3Smrg * See also: pipe_map_flags
33201e04c3fSmrg */
33301e04c3fSmrgenum gbm_bo_transfer_flags {
33401e04c3fSmrg   /**
33501e04c3fSmrg    * Buffer contents read back (or accessed directly) at transfer
33601e04c3fSmrg    * create time.
33701e04c3fSmrg    */
33801e04c3fSmrg   GBM_BO_TRANSFER_READ       = (1 << 0),
33901e04c3fSmrg   /**
34001e04c3fSmrg    * Buffer contents will be written back at unmap time
34101e04c3fSmrg    * (or modified as a result of being accessed directly).
34201e04c3fSmrg    */
34301e04c3fSmrg   GBM_BO_TRANSFER_WRITE      = (1 << 1),
34401e04c3fSmrg   /**
34501e04c3fSmrg    * Read/modify/write
34601e04c3fSmrg    */
34701e04c3fSmrg   GBM_BO_TRANSFER_READ_WRITE = (GBM_BO_TRANSFER_READ | GBM_BO_TRANSFER_WRITE),
34801e04c3fSmrg};
34901e04c3fSmrg
35001e04c3fSmrgvoid *
35101e04c3fSmrggbm_bo_map(struct gbm_bo *bo,
35201e04c3fSmrg           uint32_t x, uint32_t y, uint32_t width, uint32_t height,
35301e04c3fSmrg           uint32_t flags, uint32_t *stride, void **map_data);
35401e04c3fSmrg
35501e04c3fSmrgvoid
35601e04c3fSmrggbm_bo_unmap(struct gbm_bo *bo, void *map_data);
35701e04c3fSmrg
3583464ebd5Sriastradhuint32_t
3593464ebd5Sriastradhgbm_bo_get_width(struct gbm_bo *bo);
3603464ebd5Sriastradh
3613464ebd5Sriastradhuint32_t
3623464ebd5Sriastradhgbm_bo_get_height(struct gbm_bo *bo);
3633464ebd5Sriastradh
3643464ebd5Sriastradhuint32_t
365af69d88dSmrggbm_bo_get_stride(struct gbm_bo *bo);
366af69d88dSmrg
36701e04c3fSmrguint32_t
36801e04c3fSmrggbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane);
36901e04c3fSmrg
370af69d88dSmrguint32_t
371af69d88dSmrggbm_bo_get_format(struct gbm_bo *bo);
372af69d88dSmrg
37301e04c3fSmrguint32_t
37401e04c3fSmrggbm_bo_get_bpp(struct gbm_bo *bo);
37501e04c3fSmrg
37601e04c3fSmrguint32_t
37701e04c3fSmrggbm_bo_get_offset(struct gbm_bo *bo, int plane);
37801e04c3fSmrg
379af69d88dSmrgstruct gbm_device *
380af69d88dSmrggbm_bo_get_device(struct gbm_bo *bo);
3813464ebd5Sriastradh
3823464ebd5Sriastradhunion gbm_bo_handle
3833464ebd5Sriastradhgbm_bo_get_handle(struct gbm_bo *bo);
3843464ebd5Sriastradh
385af69d88dSmrgint
386af69d88dSmrggbm_bo_get_fd(struct gbm_bo *bo);
387af69d88dSmrg
38801e04c3fSmrguint64_t
38901e04c3fSmrggbm_bo_get_modifier(struct gbm_bo *bo);
39001e04c3fSmrg
39101e04c3fSmrgint
39201e04c3fSmrggbm_bo_get_plane_count(struct gbm_bo *bo);
39301e04c3fSmrg
39401e04c3fSmrgunion gbm_bo_handle
39501e04c3fSmrggbm_bo_get_handle_for_plane(struct gbm_bo *bo, int plane);
39601e04c3fSmrg
3977ec681f3Smrgint
3987ec681f3Smrggbm_bo_get_fd_for_plane(struct gbm_bo *bo, int plane);
3997ec681f3Smrg
400af69d88dSmrgint
401af69d88dSmrggbm_bo_write(struct gbm_bo *bo, const void *buf, size_t count);
402af69d88dSmrg
403af69d88dSmrgvoid
404af69d88dSmrggbm_bo_set_user_data(struct gbm_bo *bo, void *data,
405af69d88dSmrg		     void (*destroy_user_data)(struct gbm_bo *, void *));
406af69d88dSmrg
407af69d88dSmrgvoid *
408af69d88dSmrggbm_bo_get_user_data(struct gbm_bo *bo);
409af69d88dSmrg
4103464ebd5Sriastradhvoid
4113464ebd5Sriastradhgbm_bo_destroy(struct gbm_bo *bo);
4123464ebd5Sriastradh
413af69d88dSmrgstruct gbm_surface *
414af69d88dSmrggbm_surface_create(struct gbm_device *gbm,
415af69d88dSmrg                   uint32_t width, uint32_t height,
416af69d88dSmrg		   uint32_t format, uint32_t flags);
417af69d88dSmrg
41801e04c3fSmrgstruct gbm_surface *
41901e04c3fSmrggbm_surface_create_with_modifiers(struct gbm_device *gbm,
42001e04c3fSmrg                                  uint32_t width, uint32_t height,
42101e04c3fSmrg                                  uint32_t format,
42201e04c3fSmrg                                  const uint64_t *modifiers,
42301e04c3fSmrg                                  const unsigned int count);
424af69d88dSmrg
4257ec681f3Smrgstruct gbm_surface *
4267ec681f3Smrggbm_surface_create_with_modifiers2(struct gbm_device *gbm,
4277ec681f3Smrg                                   uint32_t width, uint32_t height,
4287ec681f3Smrg                                   uint32_t format,
4297ec681f3Smrg                                   const uint64_t *modifiers,
4307ec681f3Smrg                                   const unsigned int count,
4317ec681f3Smrg                                   uint32_t flags);
4327ec681f3Smrg
433af69d88dSmrgstruct gbm_bo *
434af69d88dSmrggbm_surface_lock_front_buffer(struct gbm_surface *surface);
435af69d88dSmrg
436af69d88dSmrgvoid
437af69d88dSmrggbm_surface_release_buffer(struct gbm_surface *surface, struct gbm_bo *bo);
438af69d88dSmrg
439af69d88dSmrgint
440af69d88dSmrggbm_surface_has_free_buffers(struct gbm_surface *surface);
441af69d88dSmrg
442af69d88dSmrgvoid
443af69d88dSmrggbm_surface_destroy(struct gbm_surface *surface);
444af69d88dSmrg
4459f464c52Smayachar *
4469f464c52Smayagbm_format_get_name(uint32_t gbm_format, struct gbm_format_name_desc *desc);
4479f464c52Smaya
4483464ebd5Sriastradh#ifdef __cplusplus
4493464ebd5Sriastradh}
4503464ebd5Sriastradh#endif
4513464ebd5Sriastradh
4523464ebd5Sriastradh#endif
453