OSDN Git Service

Misc style/indent fixes
[android-x86/external-minigbm.git] / gbm.c
1 /*
2  * Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  */
6
7 #include <stdlib.h>
8 #include <stdint.h>
9 #include <string.h>
10 #include <fcntl.h>
11 #include <xf86drm.h>
12
13 #include "gbm_priv.h"
14 #include "util.h"
15
16 extern struct gbm_driver gbm_driver_cirrus;
17 #ifdef GBM_EXYNOS
18 extern struct gbm_driver gbm_driver_exynos;
19 #endif
20 extern struct gbm_driver gbm_driver_gma500;
21 #ifdef GBM_I915
22 extern struct gbm_driver gbm_driver_i915;
23 #endif
24 #ifdef GBM_MEDIATEK
25 extern struct gbm_driver gbm_driver_mediatek;
26 #endif
27 #ifdef GBM_ROCKCHIP
28 extern struct gbm_driver gbm_driver_rockchip;
29 #endif
30 #ifdef GBM_TEGRA
31 extern struct gbm_driver gbm_driver_tegra;
32 #endif
33 extern struct gbm_driver gbm_driver_udl;
34
35 static struct gbm_driver *gbm_get_driver(int fd)
36 {
37         drmVersionPtr drm_version;
38         unsigned int i;
39
40         drm_version = drmGetVersion(fd);
41
42         if (!drm_version)
43                 return NULL;
44
45         struct gbm_driver *driver_list[] = {
46                 &gbm_driver_cirrus,
47 #ifdef GBM_EXYNOS
48                 &gbm_driver_exynos,
49 #endif
50                 &gbm_driver_gma500,
51 #ifdef GBM_I915
52                 &gbm_driver_i915,
53 #endif
54 #ifdef GBM_MEDIATEK
55                 &gbm_driver_mediatek,
56 #endif
57 #ifdef GBM_ROCKCHIP
58                 &gbm_driver_rockchip,
59 #endif
60 #ifdef GBM_TEGRA
61                 &gbm_driver_tegra,
62 #endif
63                 &gbm_driver_udl,
64         };
65
66         for(i = 0; i < ARRAY_SIZE(driver_list); i++)
67                 if (!strcmp(drm_version->name, driver_list[i]->name))
68                 {
69                         drmFreeVersion(drm_version);
70                         return driver_list[i];
71                 }
72
73         drmFreeVersion(drm_version);
74         return NULL;
75 }
76
77 PUBLIC int
78 gbm_device_get_fd(struct gbm_device *gbm)
79 {
80         return gbm->fd;
81 }
82
83 PUBLIC const char *
84 gbm_device_get_backend_name(struct gbm_device *gbm)
85 {
86         return gbm->driver->name;
87 }
88
89 PUBLIC int
90 gbm_device_is_format_supported(struct gbm_device *gbm,
91                                uint32_t format, uint32_t usage)
92 {
93         unsigned i;
94
95         if (format == GBM_BO_FORMAT_XRGB8888)
96                 format = GBM_FORMAT_XRGB8888;
97         if (format == GBM_BO_FORMAT_ARGB8888)
98                 format = GBM_FORMAT_ARGB8888;
99
100         if (usage & GBM_BO_USE_CURSOR &&
101                 usage & GBM_BO_USE_RENDERING)
102                 return 0;
103
104         for(i = 0 ; i < ARRAY_SIZE(gbm->driver->format_list); i++)
105         {
106                 if (!gbm->driver->format_list[i].format)
107                         break;
108
109                 if (gbm->driver->format_list[i].format == format &&
110                         (gbm->driver->format_list[i].usage & usage) == usage)
111                         return 1;
112         }
113
114         return 0;
115 }
116
117 PUBLIC struct gbm_device *gbm_create_device(int fd)
118 {
119         struct gbm_device *gbm;
120         int ret;
121
122         gbm = (struct gbm_device*) malloc(sizeof(*gbm));
123         if (!gbm)
124                 return NULL;
125
126         gbm->fd = fd;
127
128         gbm->driver = gbm_get_driver(fd);
129         if (!gbm->driver) {
130                 free(gbm);
131                 return NULL;
132         }
133
134         if (gbm->driver->init) {
135                 ret = gbm->driver->init(gbm);
136                 if (ret) {
137                         free(gbm);
138                         return NULL;
139                 }
140         }
141
142         return gbm;
143 }
144
145 PUBLIC void gbm_device_destroy(struct gbm_device *gbm)
146 {
147         if (gbm->driver->close)
148                 gbm->driver->close(gbm);
149         free(gbm);
150 }
151
152 PUBLIC struct gbm_surface *gbm_surface_create(struct gbm_device *gbm,
153                                               uint32_t width, uint32_t height,
154                                               uint32_t format, uint32_t flags)
155 {
156         struct gbm_surface *surface =
157                 (struct gbm_surface*) malloc(sizeof(*surface));
158
159         if (!surface)
160                 return NULL;
161
162         return surface;
163 }
164
165 PUBLIC void gbm_surface_destroy(struct gbm_surface *surface)
166 {
167         free(surface);
168 }
169
170 PUBLIC struct gbm_bo *gbm_surface_lock_front_buffer(struct gbm_surface *surface)
171 {
172         return NULL;
173 }
174
175 PUBLIC void gbm_surface_release_buffer(struct gbm_surface *surface,
176                                        struct gbm_bo *bo)
177 {
178 }
179
180 PUBLIC struct gbm_bo *gbm_bo_create(struct gbm_device *gbm, uint32_t width,
181                                     uint32_t height, uint32_t format,
182                                     uint32_t flags)
183 {
184         struct gbm_bo *bo;
185         int ret;
186
187         bo = (struct gbm_bo*) malloc(sizeof(*bo));
188         if (!bo)
189                 return NULL;
190
191         bo->gbm = gbm;
192         bo->width = width;
193         bo->height = height;
194         bo->stride = 0;
195         bo->format = format;
196         bo->handle.u32 = 0;
197         bo->destroy_user_data = NULL;
198         bo->user_data = NULL;
199
200         ret = gbm->driver->bo_create(bo, width, height, format, flags);
201         if (ret) {
202                 free(bo);
203                 return NULL;
204         }
205
206         return bo;
207 }
208
209 PUBLIC void gbm_bo_destroy(struct gbm_bo *bo)
210 {
211         if (bo->destroy_user_data) {
212                 bo->destroy_user_data(bo, bo->user_data);
213                 bo->destroy_user_data = NULL;
214                 bo->user_data = NULL;
215         }
216
217         bo->gbm->driver->bo_destroy(bo);
218         free(bo);
219 }
220
221 PUBLIC uint32_t
222 gbm_bo_get_width(struct gbm_bo *bo)
223 {
224         return bo->width;
225 }
226
227 PUBLIC uint32_t
228 gbm_bo_get_height(struct gbm_bo *bo)
229 {
230         return bo->height;
231 }
232
233 PUBLIC uint32_t
234 gbm_bo_get_stride(struct gbm_bo *bo)
235 {
236         return bo->stride;
237 }
238
239 PUBLIC uint32_t
240 gbm_bo_get_stride_or_tiling(struct gbm_bo *bo)
241 {
242         return bo->tiling ? bo->tiling : bo->stride;
243 }
244
245 PUBLIC uint32_t
246 gbm_bo_get_format(struct gbm_bo *bo)
247 {
248         return bo->format;
249 }
250
251 PUBLIC struct gbm_device *
252 gbm_bo_get_device(struct gbm_bo *bo)
253 {
254         return bo->gbm;
255 }
256
257 PUBLIC union gbm_bo_handle
258 gbm_bo_get_handle(struct gbm_bo *bo)
259 {
260         return bo->handle;
261 }
262
263 PUBLIC int
264 gbm_bo_get_fd(struct gbm_bo *bo)
265 {
266         int fd;
267
268         if (drmPrimeHandleToFD(gbm_device_get_fd(bo->gbm),
269                                 gbm_bo_get_handle(bo).u32,
270                                 DRM_CLOEXEC,
271                                 &fd))
272                 return -1;
273         else
274                 return fd;
275 }
276
277 PUBLIC void
278 gbm_bo_set_user_data(struct gbm_bo *bo, void *data,
279                      void (*destroy_user_data)(struct gbm_bo *, void *))
280 {
281         bo->user_data = data;
282         bo->destroy_user_data = destroy_user_data;
283 }
284
285 PUBLIC void *
286 gbm_bo_get_user_data(struct gbm_bo *bo)
287 {
288         return bo->user_data;
289 }