1*7688df22SAndroid Build Coastguard Worker /*
2*7688df22SAndroid Build Coastguard Worker * Copyright (C) 2010-2011 Chia-I Wu <[email protected]>
3*7688df22SAndroid Build Coastguard Worker * Copyright (C) 2010-2011 LunarG Inc.
4*7688df22SAndroid Build Coastguard Worker * Copyright (C) 2016 Linaro, Ltd., Rob Herring <[email protected]>
5*7688df22SAndroid Build Coastguard Worker * Copyright (C) 2018 Collabora, Robert Foss <[email protected]>
6*7688df22SAndroid Build Coastguard Worker *
7*7688df22SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
8*7688df22SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
9*7688df22SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
10*7688df22SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11*7688df22SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
12*7688df22SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
13*7688df22SAndroid Build Coastguard Worker *
14*7688df22SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
15*7688df22SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
16*7688df22SAndroid Build Coastguard Worker *
17*7688df22SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18*7688df22SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19*7688df22SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20*7688df22SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21*7688df22SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22*7688df22SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23*7688df22SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE.
24*7688df22SAndroid Build Coastguard Worker */
25*7688df22SAndroid Build Coastguard Worker
26*7688df22SAndroid Build Coastguard Worker #ifndef __ANDROID_GRALLOC_HANDLE_H__
27*7688df22SAndroid Build Coastguard Worker #define __ANDROID_GRALLOC_HANDLE_H__
28*7688df22SAndroid Build Coastguard Worker
29*7688df22SAndroid Build Coastguard Worker #include <cutils/native_handle.h>
30*7688df22SAndroid Build Coastguard Worker #include <stdint.h>
31*7688df22SAndroid Build Coastguard Worker
32*7688df22SAndroid Build Coastguard Worker /* support users of drm_gralloc/gbm_gralloc */
33*7688df22SAndroid Build Coastguard Worker #define gralloc_gbm_handle_t gralloc_handle_t
34*7688df22SAndroid Build Coastguard Worker #define gralloc_drm_handle_t gralloc_handle_t
35*7688df22SAndroid Build Coastguard Worker
36*7688df22SAndroid Build Coastguard Worker struct gralloc_handle_t {
37*7688df22SAndroid Build Coastguard Worker native_handle_t base;
38*7688df22SAndroid Build Coastguard Worker
39*7688df22SAndroid Build Coastguard Worker /* dma-buf file descriptor
40*7688df22SAndroid Build Coastguard Worker * Must be located first since, native_handle_t is allocated
41*7688df22SAndroid Build Coastguard Worker * using native_handle_create(), which allocates space for
42*7688df22SAndroid Build Coastguard Worker * sizeof(native_handle_t) + sizeof(int) * (numFds + numInts)
43*7688df22SAndroid Build Coastguard Worker * numFds = GRALLOC_HANDLE_NUM_FDS
44*7688df22SAndroid Build Coastguard Worker * numInts = GRALLOC_HANDLE_NUM_INTS
45*7688df22SAndroid Build Coastguard Worker * Where numFds represents the number of FDs and
46*7688df22SAndroid Build Coastguard Worker * numInts represents the space needed for the
47*7688df22SAndroid Build Coastguard Worker * remainder of this struct.
48*7688df22SAndroid Build Coastguard Worker * And the FDs are expected to be found first following
49*7688df22SAndroid Build Coastguard Worker * native_handle_t.
50*7688df22SAndroid Build Coastguard Worker */
51*7688df22SAndroid Build Coastguard Worker int prime_fd;
52*7688df22SAndroid Build Coastguard Worker
53*7688df22SAndroid Build Coastguard Worker /* api variables */
54*7688df22SAndroid Build Coastguard Worker uint32_t magic; /* differentiate between allocator impls */
55*7688df22SAndroid Build Coastguard Worker uint32_t version; /* api version */
56*7688df22SAndroid Build Coastguard Worker
57*7688df22SAndroid Build Coastguard Worker uint32_t width; /* width of buffer in pixels */
58*7688df22SAndroid Build Coastguard Worker uint32_t height; /* height of buffer in pixels */
59*7688df22SAndroid Build Coastguard Worker uint32_t format; /* pixel format (Android) */
60*7688df22SAndroid Build Coastguard Worker uint32_t usage; /* android libhardware usage flags */
61*7688df22SAndroid Build Coastguard Worker
62*7688df22SAndroid Build Coastguard Worker uint32_t stride; /* the stride in bytes */
63*7688df22SAndroid Build Coastguard Worker int data_owner; /* owner of data (for validation) */
64*7688df22SAndroid Build Coastguard Worker uint64_t modifier __attribute__((aligned(8))); /* buffer modifiers */
65*7688df22SAndroid Build Coastguard Worker
66*7688df22SAndroid Build Coastguard Worker union {
67*7688df22SAndroid Build Coastguard Worker void *data; /* pointer to struct gralloc_gbm_bo_t */
68*7688df22SAndroid Build Coastguard Worker uint64_t reserved;
69*7688df22SAndroid Build Coastguard Worker } __attribute__((aligned(8)));
70*7688df22SAndroid Build Coastguard Worker };
71*7688df22SAndroid Build Coastguard Worker
72*7688df22SAndroid Build Coastguard Worker #define GRALLOC_HANDLE_VERSION 4
73*7688df22SAndroid Build Coastguard Worker #define GRALLOC_HANDLE_MAGIC 0x60585350
74*7688df22SAndroid Build Coastguard Worker #define GRALLOC_HANDLE_NUM_FDS 1
75*7688df22SAndroid Build Coastguard Worker #define GRALLOC_HANDLE_NUM_INTS ( \
76*7688df22SAndroid Build Coastguard Worker ((sizeof(struct gralloc_handle_t) - sizeof(native_handle_t))/sizeof(int)) \
77*7688df22SAndroid Build Coastguard Worker - GRALLOC_HANDLE_NUM_FDS)
78*7688df22SAndroid Build Coastguard Worker
gralloc_handle(buffer_handle_t handle)79*7688df22SAndroid Build Coastguard Worker static inline struct gralloc_handle_t *gralloc_handle(buffer_handle_t handle)
80*7688df22SAndroid Build Coastguard Worker {
81*7688df22SAndroid Build Coastguard Worker return (struct gralloc_handle_t *)handle;
82*7688df22SAndroid Build Coastguard Worker }
83*7688df22SAndroid Build Coastguard Worker
84*7688df22SAndroid Build Coastguard Worker /**
85*7688df22SAndroid Build Coastguard Worker * Create a buffer handle.
86*7688df22SAndroid Build Coastguard Worker */
gralloc_handle_create(int32_t width,int32_t height,int32_t hal_format,int32_t usage)87*7688df22SAndroid Build Coastguard Worker static inline native_handle_t *gralloc_handle_create(int32_t width,
88*7688df22SAndroid Build Coastguard Worker int32_t height,
89*7688df22SAndroid Build Coastguard Worker int32_t hal_format,
90*7688df22SAndroid Build Coastguard Worker int32_t usage)
91*7688df22SAndroid Build Coastguard Worker {
92*7688df22SAndroid Build Coastguard Worker struct gralloc_handle_t *handle;
93*7688df22SAndroid Build Coastguard Worker native_handle_t *nhandle = native_handle_create(GRALLOC_HANDLE_NUM_FDS,
94*7688df22SAndroid Build Coastguard Worker GRALLOC_HANDLE_NUM_INTS);
95*7688df22SAndroid Build Coastguard Worker
96*7688df22SAndroid Build Coastguard Worker if (!nhandle)
97*7688df22SAndroid Build Coastguard Worker return NULL;
98*7688df22SAndroid Build Coastguard Worker
99*7688df22SAndroid Build Coastguard Worker handle = gralloc_handle(nhandle);
100*7688df22SAndroid Build Coastguard Worker handle->magic = GRALLOC_HANDLE_MAGIC;
101*7688df22SAndroid Build Coastguard Worker handle->version = GRALLOC_HANDLE_VERSION;
102*7688df22SAndroid Build Coastguard Worker handle->width = width;
103*7688df22SAndroid Build Coastguard Worker handle->height = height;
104*7688df22SAndroid Build Coastguard Worker handle->format = hal_format;
105*7688df22SAndroid Build Coastguard Worker handle->usage = usage;
106*7688df22SAndroid Build Coastguard Worker handle->prime_fd = -1;
107*7688df22SAndroid Build Coastguard Worker
108*7688df22SAndroid Build Coastguard Worker return nhandle;
109*7688df22SAndroid Build Coastguard Worker }
110*7688df22SAndroid Build Coastguard Worker
111*7688df22SAndroid Build Coastguard Worker #endif
112