1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2008 VMware, Inc.
4*61046927SAndroid Build Coastguard Worker * Copyright 2009-2010 Chia-I Wu <[email protected]>
5*61046927SAndroid Build Coastguard Worker * Copyright 2010-2011 LunarG, Inc.
6*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
7*61046927SAndroid Build Coastguard Worker *
8*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
9*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
10*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
11*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
12*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
13*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
14*61046927SAndroid Build Coastguard Worker * the following conditions:
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
17*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
18*61046927SAndroid Build Coastguard Worker * of the Software.
19*61046927SAndroid Build Coastguard Worker *
20*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26*61046927SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE.
27*61046927SAndroid Build Coastguard Worker *
28*61046927SAndroid Build Coastguard Worker **************************************************************************/
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker /**
31*61046927SAndroid Build Coastguard Worker * Public EGL API entrypoints
32*61046927SAndroid Build Coastguard Worker *
33*61046927SAndroid Build Coastguard Worker * Generally, we use the EGLDisplay parameter as a key to lookup the
34*61046927SAndroid Build Coastguard Worker * appropriate device driver handle, then jump though the driver's
35*61046927SAndroid Build Coastguard Worker * dispatch table to handle the function.
36*61046927SAndroid Build Coastguard Worker *
37*61046927SAndroid Build Coastguard Worker * That allows us the option of supporting multiple, simultaneous,
38*61046927SAndroid Build Coastguard Worker * heterogeneous hardware devices in the future.
39*61046927SAndroid Build Coastguard Worker *
40*61046927SAndroid Build Coastguard Worker * The EGLDisplay, EGLConfig, EGLContext and EGLSurface types are
41*61046927SAndroid Build Coastguard Worker * opaque handles. Internal objects are linked to a display to
42*61046927SAndroid Build Coastguard Worker * create the handles.
43*61046927SAndroid Build Coastguard Worker *
44*61046927SAndroid Build Coastguard Worker * For each public API entry point, the opaque handles are looked up
45*61046927SAndroid Build Coastguard Worker * before being dispatched to the drivers. When it fails to look up
46*61046927SAndroid Build Coastguard Worker * a handle, one of
47*61046927SAndroid Build Coastguard Worker *
48*61046927SAndroid Build Coastguard Worker * EGL_BAD_DISPLAY
49*61046927SAndroid Build Coastguard Worker * EGL_BAD_CONFIG
50*61046927SAndroid Build Coastguard Worker * EGL_BAD_CONTEXT
51*61046927SAndroid Build Coastguard Worker * EGL_BAD_SURFACE
52*61046927SAndroid Build Coastguard Worker * EGL_BAD_SCREEN_MESA
53*61046927SAndroid Build Coastguard Worker * EGL_BAD_MODE_MESA
54*61046927SAndroid Build Coastguard Worker *
55*61046927SAndroid Build Coastguard Worker * is generated and the driver function is not called. An
56*61046927SAndroid Build Coastguard Worker * uninitialized EGLDisplay has no driver associated with it. When
57*61046927SAndroid Build Coastguard Worker * such display is detected,
58*61046927SAndroid Build Coastguard Worker *
59*61046927SAndroid Build Coastguard Worker * EGL_NOT_INITIALIZED
60*61046927SAndroid Build Coastguard Worker *
61*61046927SAndroid Build Coastguard Worker * is generated.
62*61046927SAndroid Build Coastguard Worker *
63*61046927SAndroid Build Coastguard Worker * Some of the entry points use current display, context, or surface
64*61046927SAndroid Build Coastguard Worker * implicitly. For such entry points, the implicit objects are also
65*61046927SAndroid Build Coastguard Worker * checked before calling the driver function. Other than the
66*61046927SAndroid Build Coastguard Worker * errors listed above,
67*61046927SAndroid Build Coastguard Worker *
68*61046927SAndroid Build Coastguard Worker * EGL_BAD_CURRENT_SURFACE
69*61046927SAndroid Build Coastguard Worker *
70*61046927SAndroid Build Coastguard Worker * may also be generated.
71*61046927SAndroid Build Coastguard Worker *
72*61046927SAndroid Build Coastguard Worker * Notes on naming conventions:
73*61046927SAndroid Build Coastguard Worker *
74*61046927SAndroid Build Coastguard Worker * eglFooBar - public EGL function
75*61046927SAndroid Build Coastguard Worker * EGL_FOO_BAR - public EGL token
76*61046927SAndroid Build Coastguard Worker * EGLDatatype - public EGL datatype
77*61046927SAndroid Build Coastguard Worker *
78*61046927SAndroid Build Coastguard Worker * _eglFooBar - private EGL function
79*61046927SAndroid Build Coastguard Worker * _EGLDatatype - private EGL datatype, typedef'd struct
80*61046927SAndroid Build Coastguard Worker * _egl_struct - private EGL struct, non-typedef'd
81*61046927SAndroid Build Coastguard Worker *
82*61046927SAndroid Build Coastguard Worker */
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker #if USE_LIBGLVND
85*61046927SAndroid Build Coastguard Worker #define EGLAPI
86*61046927SAndroid Build Coastguard Worker #undef PUBLIC
87*61046927SAndroid Build Coastguard Worker #define PUBLIC
88*61046927SAndroid Build Coastguard Worker #endif
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker #include <assert.h>
91*61046927SAndroid Build Coastguard Worker #include <stdio.h>
92*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
93*61046927SAndroid Build Coastguard Worker #include <string.h>
94*61046927SAndroid Build Coastguard Worker #include "c11/threads.h"
95*61046927SAndroid Build Coastguard Worker #include "mapi/glapi/glapi.h"
96*61046927SAndroid Build Coastguard Worker #include "util/detect_os.h"
97*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
98*61046927SAndroid Build Coastguard Worker #include "util/perf/cpu_trace.h"
99*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker #include "eglconfig.h"
102*61046927SAndroid Build Coastguard Worker #include "eglcontext.h"
103*61046927SAndroid Build Coastguard Worker #include "eglcurrent.h"
104*61046927SAndroid Build Coastguard Worker #include "egldefines.h"
105*61046927SAndroid Build Coastguard Worker #include "egldevice.h"
106*61046927SAndroid Build Coastguard Worker #include "egldisplay.h"
107*61046927SAndroid Build Coastguard Worker #include "egldriver.h"
108*61046927SAndroid Build Coastguard Worker #include "eglglobals.h"
109*61046927SAndroid Build Coastguard Worker #include "eglimage.h"
110*61046927SAndroid Build Coastguard Worker #include "egllog.h"
111*61046927SAndroid Build Coastguard Worker #include "eglsurface.h"
112*61046927SAndroid Build Coastguard Worker #include "eglsync.h"
113*61046927SAndroid Build Coastguard Worker #include "egltypedefs.h"
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker #include "GL/mesa_glinterop.h"
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker /**
118*61046927SAndroid Build Coastguard Worker * Macros to help return an API entrypoint.
119*61046927SAndroid Build Coastguard Worker *
120*61046927SAndroid Build Coastguard Worker * These macros will unlock the display and record the error code.
121*61046927SAndroid Build Coastguard Worker */
122*61046927SAndroid Build Coastguard Worker #define RETURN_EGL_ERROR(disp, err, ret) \
123*61046927SAndroid Build Coastguard Worker do { \
124*61046927SAndroid Build Coastguard Worker if (disp) \
125*61046927SAndroid Build Coastguard Worker _eglUnlockDisplay(disp); \
126*61046927SAndroid Build Coastguard Worker /* EGL error codes are non-zero */ \
127*61046927SAndroid Build Coastguard Worker if (err) \
128*61046927SAndroid Build Coastguard Worker _eglError(err, __func__); \
129*61046927SAndroid Build Coastguard Worker return ret; \
130*61046927SAndroid Build Coastguard Worker } while (0)
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker #define RETURN_EGL_SUCCESS(disp, ret) RETURN_EGL_ERROR(disp, EGL_SUCCESS, ret)
133*61046927SAndroid Build Coastguard Worker
134*61046927SAndroid Build Coastguard Worker /* record EGL_SUCCESS only when ret evaluates to true */
135*61046927SAndroid Build Coastguard Worker #define RETURN_EGL_EVAL(disp, ret) \
136*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, (ret) ? EGL_SUCCESS : 0, ret)
137*61046927SAndroid Build Coastguard Worker
138*61046927SAndroid Build Coastguard Worker /*
139*61046927SAndroid Build Coastguard Worker * A bunch of macros and checks to simplify error checking.
140*61046927SAndroid Build Coastguard Worker */
141*61046927SAndroid Build Coastguard Worker
142*61046927SAndroid Build Coastguard Worker #define _EGL_CHECK_DISPLAY(disp, ret) \
143*61046927SAndroid Build Coastguard Worker do { \
144*61046927SAndroid Build Coastguard Worker if (!_eglCheckDisplay(disp, __func__)) \
145*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, 0, ret); \
146*61046927SAndroid Build Coastguard Worker } while (0)
147*61046927SAndroid Build Coastguard Worker
148*61046927SAndroid Build Coastguard Worker #define _EGL_CHECK_OBJECT(disp, type, obj, ret) \
149*61046927SAndroid Build Coastguard Worker do { \
150*61046927SAndroid Build Coastguard Worker if (!_eglCheck##type(disp, obj, __func__)) \
151*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, 0, ret); \
152*61046927SAndroid Build Coastguard Worker } while (0)
153*61046927SAndroid Build Coastguard Worker
154*61046927SAndroid Build Coastguard Worker #define _EGL_CHECK_SURFACE(disp, surf, ret) \
155*61046927SAndroid Build Coastguard Worker _EGL_CHECK_OBJECT(disp, Surface, surf, ret)
156*61046927SAndroid Build Coastguard Worker
157*61046927SAndroid Build Coastguard Worker #define _EGL_CHECK_CONTEXT(disp, context, ret) \
158*61046927SAndroid Build Coastguard Worker _EGL_CHECK_OBJECT(disp, Context, context, ret)
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker #define _EGL_CHECK_CONFIG(disp, conf, ret) \
161*61046927SAndroid Build Coastguard Worker _EGL_CHECK_OBJECT(disp, Config, conf, ret)
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard Worker #define _EGL_CHECK_SYNC(disp, s, ret) _EGL_CHECK_OBJECT(disp, Sync, s, ret)
164*61046927SAndroid Build Coastguard Worker
165*61046927SAndroid Build Coastguard Worker static _EGLResource **
_egl_relax_begin(_EGLDisplay * disp,_EGLResource ** rs,unsigned rs_count)166*61046927SAndroid Build Coastguard Worker _egl_relax_begin(_EGLDisplay *disp, _EGLResource **rs, unsigned rs_count)
167*61046927SAndroid Build Coastguard Worker {
168*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < rs_count; i++)
169*61046927SAndroid Build Coastguard Worker if (rs[i])
170*61046927SAndroid Build Coastguard Worker _eglGetResource(rs[i]);
171*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(&disp->Mutex);
172*61046927SAndroid Build Coastguard Worker return rs;
173*61046927SAndroid Build Coastguard Worker }
174*61046927SAndroid Build Coastguard Worker
175*61046927SAndroid Build Coastguard Worker static _EGLResource **
_egl_relax_end(_EGLDisplay * disp,_EGLResource ** rs,unsigned rs_count)176*61046927SAndroid Build Coastguard Worker _egl_relax_end(_EGLDisplay *disp, _EGLResource **rs, unsigned rs_count)
177*61046927SAndroid Build Coastguard Worker {
178*61046927SAndroid Build Coastguard Worker simple_mtx_lock(&disp->Mutex);
179*61046927SAndroid Build Coastguard Worker for (unsigned i = 0; i < rs_count; i++)
180*61046927SAndroid Build Coastguard Worker if (rs[i])
181*61046927SAndroid Build Coastguard Worker _eglPutResource(rs[i]);
182*61046927SAndroid Build Coastguard Worker return NULL;
183*61046927SAndroid Build Coastguard Worker }
184*61046927SAndroid Build Coastguard Worker
185*61046927SAndroid Build Coastguard Worker /**
186*61046927SAndroid Build Coastguard Worker * Helper to relax (drop) the EGL BDL over it's body, optionally holding
187*61046927SAndroid Build Coastguard Worker * a reference to a list of _EGLResource's until the lock is re-acquired,
188*61046927SAndroid Build Coastguard Worker * protecting the resources from destruction while the BDL is dropped.
189*61046927SAndroid Build Coastguard Worker */
190*61046927SAndroid Build Coastguard Worker #define egl_relax(disp, ...) \
191*61046927SAndroid Build Coastguard Worker for (_EGLResource * __rs[] = {NULL /* for vs2019 */, __VA_ARGS__}, \
192*61046927SAndroid Build Coastguard Worker **__rsp = \
193*61046927SAndroid Build Coastguard Worker _egl_relax_begin(disp, __rs, ARRAY_SIZE(__rs)); \
194*61046927SAndroid Build Coastguard Worker __rsp; __rsp = _egl_relax_end(disp, __rs, ARRAY_SIZE(__rs)))
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker extern const _EGLDriver _eglDriver;
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker struct _egl_entrypoint {
199*61046927SAndroid Build Coastguard Worker const char *name;
200*61046927SAndroid Build Coastguard Worker _EGLProc function;
201*61046927SAndroid Build Coastguard Worker };
202*61046927SAndroid Build Coastguard Worker
203*61046927SAndroid Build Coastguard Worker static inline bool
_eglCheckDisplay(_EGLDisplay * disp,const char * msg)204*61046927SAndroid Build Coastguard Worker _eglCheckDisplay(_EGLDisplay *disp, const char *msg)
205*61046927SAndroid Build Coastguard Worker {
206*61046927SAndroid Build Coastguard Worker if (!disp) {
207*61046927SAndroid Build Coastguard Worker _eglError(EGL_BAD_DISPLAY, msg);
208*61046927SAndroid Build Coastguard Worker return false;
209*61046927SAndroid Build Coastguard Worker }
210*61046927SAndroid Build Coastguard Worker if (!disp->Initialized) {
211*61046927SAndroid Build Coastguard Worker _eglError(EGL_NOT_INITIALIZED, msg);
212*61046927SAndroid Build Coastguard Worker return false;
213*61046927SAndroid Build Coastguard Worker }
214*61046927SAndroid Build Coastguard Worker return true;
215*61046927SAndroid Build Coastguard Worker }
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker static inline bool
_eglCheckSurface(_EGLDisplay * disp,_EGLSurface * surf,const char * msg)218*61046927SAndroid Build Coastguard Worker _eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
219*61046927SAndroid Build Coastguard Worker {
220*61046927SAndroid Build Coastguard Worker if (!_eglCheckDisplay(disp, msg))
221*61046927SAndroid Build Coastguard Worker return false;
222*61046927SAndroid Build Coastguard Worker if (!surf) {
223*61046927SAndroid Build Coastguard Worker _eglError(EGL_BAD_SURFACE, msg);
224*61046927SAndroid Build Coastguard Worker return false;
225*61046927SAndroid Build Coastguard Worker }
226*61046927SAndroid Build Coastguard Worker return true;
227*61046927SAndroid Build Coastguard Worker }
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker static inline bool
_eglCheckContext(_EGLDisplay * disp,_EGLContext * context,const char * msg)230*61046927SAndroid Build Coastguard Worker _eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
231*61046927SAndroid Build Coastguard Worker {
232*61046927SAndroid Build Coastguard Worker if (!_eglCheckDisplay(disp, msg))
233*61046927SAndroid Build Coastguard Worker return false;
234*61046927SAndroid Build Coastguard Worker if (!context) {
235*61046927SAndroid Build Coastguard Worker _eglError(EGL_BAD_CONTEXT, msg);
236*61046927SAndroid Build Coastguard Worker return false;
237*61046927SAndroid Build Coastguard Worker }
238*61046927SAndroid Build Coastguard Worker return true;
239*61046927SAndroid Build Coastguard Worker }
240*61046927SAndroid Build Coastguard Worker
241*61046927SAndroid Build Coastguard Worker static inline bool
_eglCheckConfig(_EGLDisplay * disp,_EGLConfig * conf,const char * msg)242*61046927SAndroid Build Coastguard Worker _eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
243*61046927SAndroid Build Coastguard Worker {
244*61046927SAndroid Build Coastguard Worker if (!_eglCheckDisplay(disp, msg))
245*61046927SAndroid Build Coastguard Worker return false;
246*61046927SAndroid Build Coastguard Worker if (!conf) {
247*61046927SAndroid Build Coastguard Worker _eglError(EGL_BAD_CONFIG, msg);
248*61046927SAndroid Build Coastguard Worker return false;
249*61046927SAndroid Build Coastguard Worker }
250*61046927SAndroid Build Coastguard Worker return true;
251*61046927SAndroid Build Coastguard Worker }
252*61046927SAndroid Build Coastguard Worker
253*61046927SAndroid Build Coastguard Worker static inline bool
_eglCheckSync(_EGLDisplay * disp,_EGLSync * s,const char * msg)254*61046927SAndroid Build Coastguard Worker _eglCheckSync(_EGLDisplay *disp, _EGLSync *s, const char *msg)
255*61046927SAndroid Build Coastguard Worker {
256*61046927SAndroid Build Coastguard Worker if (!_eglCheckDisplay(disp, msg))
257*61046927SAndroid Build Coastguard Worker return false;
258*61046927SAndroid Build Coastguard Worker if (!s) {
259*61046927SAndroid Build Coastguard Worker _eglError(EGL_BAD_PARAMETER, msg);
260*61046927SAndroid Build Coastguard Worker return false;
261*61046927SAndroid Build Coastguard Worker }
262*61046927SAndroid Build Coastguard Worker return true;
263*61046927SAndroid Build Coastguard Worker }
264*61046927SAndroid Build Coastguard Worker
265*61046927SAndroid Build Coastguard Worker /**
266*61046927SAndroid Build Coastguard Worker * Lookup a handle to find the linked display.
267*61046927SAndroid Build Coastguard Worker * Return NULL if the handle has no corresponding linked display.
268*61046927SAndroid Build Coastguard Worker */
269*61046927SAndroid Build Coastguard Worker static _EGLDisplay *
_eglLookupDisplay(EGLDisplay dpy)270*61046927SAndroid Build Coastguard Worker _eglLookupDisplay(EGLDisplay dpy)
271*61046927SAndroid Build Coastguard Worker {
272*61046927SAndroid Build Coastguard Worker simple_mtx_lock(_eglGlobal.Mutex);
273*61046927SAndroid Build Coastguard Worker
274*61046927SAndroid Build Coastguard Worker _EGLDisplay *cur = _eglGlobal.DisplayList;
275*61046927SAndroid Build Coastguard Worker while (cur) {
276*61046927SAndroid Build Coastguard Worker if (cur == (_EGLDisplay *)dpy)
277*61046927SAndroid Build Coastguard Worker break;
278*61046927SAndroid Build Coastguard Worker cur = cur->Next;
279*61046927SAndroid Build Coastguard Worker }
280*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(_eglGlobal.Mutex);
281*61046927SAndroid Build Coastguard Worker
282*61046927SAndroid Build Coastguard Worker return cur;
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker /**
286*61046927SAndroid Build Coastguard Worker * Lookup and lock a display.
287*61046927SAndroid Build Coastguard Worker */
288*61046927SAndroid Build Coastguard Worker _EGLDisplay *
_eglLockDisplay(EGLDisplay dpy)289*61046927SAndroid Build Coastguard Worker _eglLockDisplay(EGLDisplay dpy)
290*61046927SAndroid Build Coastguard Worker {
291*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLookupDisplay(dpy);
292*61046927SAndroid Build Coastguard Worker if (disp) {
293*61046927SAndroid Build Coastguard Worker u_rwlock_rdlock(&disp->TerminateLock);
294*61046927SAndroid Build Coastguard Worker simple_mtx_lock(&disp->Mutex);
295*61046927SAndroid Build Coastguard Worker }
296*61046927SAndroid Build Coastguard Worker return disp;
297*61046927SAndroid Build Coastguard Worker }
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker /**
300*61046927SAndroid Build Coastguard Worker * Lookup and write-lock a display. Should only be called from
301*61046927SAndroid Build Coastguard Worker * eglTerminate.
302*61046927SAndroid Build Coastguard Worker */
303*61046927SAndroid Build Coastguard Worker static _EGLDisplay *
_eglWriteLockDisplay(EGLDisplay dpy)304*61046927SAndroid Build Coastguard Worker _eglWriteLockDisplay(EGLDisplay dpy)
305*61046927SAndroid Build Coastguard Worker {
306*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLookupDisplay(dpy);
307*61046927SAndroid Build Coastguard Worker if (disp) {
308*61046927SAndroid Build Coastguard Worker u_rwlock_wrlock(&disp->TerminateLock);
309*61046927SAndroid Build Coastguard Worker simple_mtx_lock(&disp->Mutex);
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker return disp;
312*61046927SAndroid Build Coastguard Worker }
313*61046927SAndroid Build Coastguard Worker
314*61046927SAndroid Build Coastguard Worker /**
315*61046927SAndroid Build Coastguard Worker * Unlock a display.
316*61046927SAndroid Build Coastguard Worker */
317*61046927SAndroid Build Coastguard Worker void
_eglUnlockDisplay(_EGLDisplay * disp)318*61046927SAndroid Build Coastguard Worker _eglUnlockDisplay(_EGLDisplay *disp)
319*61046927SAndroid Build Coastguard Worker {
320*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(&disp->Mutex);
321*61046927SAndroid Build Coastguard Worker u_rwlock_rdunlock(&disp->TerminateLock);
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker static void
_eglSetFuncName(const char * funcName,_EGLDisplay * disp,EGLenum objectType,_EGLResource * object)325*61046927SAndroid Build Coastguard Worker _eglSetFuncName(const char *funcName, _EGLDisplay *disp, EGLenum objectType,
326*61046927SAndroid Build Coastguard Worker _EGLResource *object)
327*61046927SAndroid Build Coastguard Worker {
328*61046927SAndroid Build Coastguard Worker _EGLThreadInfo *thr = _eglGetCurrentThread();
329*61046927SAndroid Build Coastguard Worker thr->CurrentFuncName = funcName;
330*61046927SAndroid Build Coastguard Worker thr->CurrentObjectLabel = NULL;
331*61046927SAndroid Build Coastguard Worker
332*61046927SAndroid Build Coastguard Worker if (objectType == EGL_OBJECT_THREAD_KHR)
333*61046927SAndroid Build Coastguard Worker thr->CurrentObjectLabel = thr->Label;
334*61046927SAndroid Build Coastguard Worker else if (objectType == EGL_OBJECT_DISPLAY_KHR && disp)
335*61046927SAndroid Build Coastguard Worker thr->CurrentObjectLabel = disp->Label;
336*61046927SAndroid Build Coastguard Worker else if (object)
337*61046927SAndroid Build Coastguard Worker thr->CurrentObjectLabel = object->Label;
338*61046927SAndroid Build Coastguard Worker }
339*61046927SAndroid Build Coastguard Worker
340*61046927SAndroid Build Coastguard Worker #define _EGL_FUNC_START(disp, objectType, object) \
341*61046927SAndroid Build Coastguard Worker do { \
342*61046927SAndroid Build Coastguard Worker MESA_TRACE_FUNC(); \
343*61046927SAndroid Build Coastguard Worker _eglSetFuncName(__func__, disp, objectType, (_EGLResource *)object); \
344*61046927SAndroid Build Coastguard Worker } while (0)
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker /**
347*61046927SAndroid Build Coastguard Worker * Convert an attribute list from EGLint[] to EGLAttrib[].
348*61046927SAndroid Build Coastguard Worker *
349*61046927SAndroid Build Coastguard Worker * Return an EGL error code. The output parameter out_attrib_list is modified
350*61046927SAndroid Build Coastguard Worker * only on success.
351*61046927SAndroid Build Coastguard Worker */
352*61046927SAndroid Build Coastguard Worker static EGLint
_eglConvertIntsToAttribs(const EGLint * int_list,EGLAttrib ** out_attrib_list)353*61046927SAndroid Build Coastguard Worker _eglConvertIntsToAttribs(const EGLint *int_list, EGLAttrib **out_attrib_list)
354*61046927SAndroid Build Coastguard Worker {
355*61046927SAndroid Build Coastguard Worker size_t len = 0;
356*61046927SAndroid Build Coastguard Worker EGLAttrib *attrib_list;
357*61046927SAndroid Build Coastguard Worker
358*61046927SAndroid Build Coastguard Worker if (int_list) {
359*61046927SAndroid Build Coastguard Worker while (int_list[2 * len] != EGL_NONE)
360*61046927SAndroid Build Coastguard Worker ++len;
361*61046927SAndroid Build Coastguard Worker }
362*61046927SAndroid Build Coastguard Worker
363*61046927SAndroid Build Coastguard Worker if (len == 0) {
364*61046927SAndroid Build Coastguard Worker *out_attrib_list = NULL;
365*61046927SAndroid Build Coastguard Worker return EGL_SUCCESS;
366*61046927SAndroid Build Coastguard Worker }
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Worker if (2 * len + 1 > SIZE_MAX / sizeof(EGLAttrib))
369*61046927SAndroid Build Coastguard Worker return EGL_BAD_ALLOC;
370*61046927SAndroid Build Coastguard Worker
371*61046927SAndroid Build Coastguard Worker attrib_list = malloc((2 * len + 1) * sizeof(EGLAttrib));
372*61046927SAndroid Build Coastguard Worker if (!attrib_list)
373*61046927SAndroid Build Coastguard Worker return EGL_BAD_ALLOC;
374*61046927SAndroid Build Coastguard Worker
375*61046927SAndroid Build Coastguard Worker for (size_t i = 0; i < len; ++i) {
376*61046927SAndroid Build Coastguard Worker attrib_list[2 * i + 0] = int_list[2 * i + 0];
377*61046927SAndroid Build Coastguard Worker attrib_list[2 * i + 1] = int_list[2 * i + 1];
378*61046927SAndroid Build Coastguard Worker }
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker attrib_list[2 * len] = EGL_NONE;
381*61046927SAndroid Build Coastguard Worker
382*61046927SAndroid Build Coastguard Worker *out_attrib_list = attrib_list;
383*61046927SAndroid Build Coastguard Worker return EGL_SUCCESS;
384*61046927SAndroid Build Coastguard Worker }
385*61046927SAndroid Build Coastguard Worker
386*61046927SAndroid Build Coastguard Worker static EGLint *
_eglConvertAttribsToInt(const EGLAttrib * attr_list)387*61046927SAndroid Build Coastguard Worker _eglConvertAttribsToInt(const EGLAttrib *attr_list)
388*61046927SAndroid Build Coastguard Worker {
389*61046927SAndroid Build Coastguard Worker size_t size = _eglNumAttribs(attr_list);
390*61046927SAndroid Build Coastguard Worker EGLint *int_attribs = NULL;
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker /* Convert attributes from EGLAttrib[] to EGLint[] */
393*61046927SAndroid Build Coastguard Worker if (size) {
394*61046927SAndroid Build Coastguard Worker int_attribs = calloc(size, sizeof(int_attribs[0]));
395*61046927SAndroid Build Coastguard Worker if (!int_attribs)
396*61046927SAndroid Build Coastguard Worker return NULL;
397*61046927SAndroid Build Coastguard Worker
398*61046927SAndroid Build Coastguard Worker for (size_t i = 0; i < size; i++)
399*61046927SAndroid Build Coastguard Worker int_attribs[i] = attr_list[i];
400*61046927SAndroid Build Coastguard Worker }
401*61046927SAndroid Build Coastguard Worker return int_attribs;
402*61046927SAndroid Build Coastguard Worker }
403*61046927SAndroid Build Coastguard Worker
404*61046927SAndroid Build Coastguard Worker /**
405*61046927SAndroid Build Coastguard Worker * This is typically the first EGL function that an application calls.
406*61046927SAndroid Build Coastguard Worker * It associates a private _EGLDisplay object to the native display.
407*61046927SAndroid Build Coastguard Worker */
408*61046927SAndroid Build Coastguard Worker PUBLIC EGLDisplay EGLAPIENTRY
eglGetDisplay(EGLNativeDisplayType nativeDisplay)409*61046927SAndroid Build Coastguard Worker eglGetDisplay(EGLNativeDisplayType nativeDisplay)
410*61046927SAndroid Build Coastguard Worker {
411*61046927SAndroid Build Coastguard Worker _EGLPlatformType plat;
412*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp;
413*61046927SAndroid Build Coastguard Worker void *native_display_ptr;
414*61046927SAndroid Build Coastguard Worker
415*61046927SAndroid Build Coastguard Worker #if !DETECT_OS_ANDROID
416*61046927SAndroid Build Coastguard Worker util_cpu_trace_init();
417*61046927SAndroid Build Coastguard Worker #endif
418*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL);
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(void *) >= sizeof(nativeDisplay));
421*61046927SAndroid Build Coastguard Worker native_display_ptr = (void *)nativeDisplay;
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker plat = _eglGetNativePlatform(native_display_ptr);
424*61046927SAndroid Build Coastguard Worker disp = _eglFindDisplay(plat, native_display_ptr, NULL);
425*61046927SAndroid Build Coastguard Worker return _eglGetDisplayHandle(disp);
426*61046927SAndroid Build Coastguard Worker }
427*61046927SAndroid Build Coastguard Worker
428*61046927SAndroid Build Coastguard Worker static EGLDisplay
_eglGetPlatformDisplayCommon(EGLenum platform,void * native_display,const EGLAttrib * attrib_list)429*61046927SAndroid Build Coastguard Worker _eglGetPlatformDisplayCommon(EGLenum platform, void *native_display,
430*61046927SAndroid Build Coastguard Worker const EGLAttrib *attrib_list)
431*61046927SAndroid Build Coastguard Worker {
432*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp;
433*61046927SAndroid Build Coastguard Worker
434*61046927SAndroid Build Coastguard Worker switch (platform) {
435*61046927SAndroid Build Coastguard Worker #ifdef HAVE_X11_PLATFORM
436*61046927SAndroid Build Coastguard Worker case EGL_PLATFORM_X11_EXT:
437*61046927SAndroid Build Coastguard Worker disp = _eglGetX11Display((Display *)native_display, attrib_list);
438*61046927SAndroid Build Coastguard Worker break;
439*61046927SAndroid Build Coastguard Worker #endif
440*61046927SAndroid Build Coastguard Worker #ifdef HAVE_XCB_PLATFORM
441*61046927SAndroid Build Coastguard Worker case EGL_PLATFORM_XCB_EXT:
442*61046927SAndroid Build Coastguard Worker disp = _eglGetXcbDisplay((xcb_connection_t *)native_display, attrib_list);
443*61046927SAndroid Build Coastguard Worker break;
444*61046927SAndroid Build Coastguard Worker #endif
445*61046927SAndroid Build Coastguard Worker #ifdef HAVE_DRM_PLATFORM
446*61046927SAndroid Build Coastguard Worker case EGL_PLATFORM_GBM_MESA:
447*61046927SAndroid Build Coastguard Worker disp =
448*61046927SAndroid Build Coastguard Worker _eglGetGbmDisplay((struct gbm_device *)native_display, attrib_list);
449*61046927SAndroid Build Coastguard Worker break;
450*61046927SAndroid Build Coastguard Worker #endif
451*61046927SAndroid Build Coastguard Worker #ifdef HAVE_WAYLAND_PLATFORM
452*61046927SAndroid Build Coastguard Worker case EGL_PLATFORM_WAYLAND_EXT:
453*61046927SAndroid Build Coastguard Worker disp = _eglGetWaylandDisplay((struct wl_display *)native_display,
454*61046927SAndroid Build Coastguard Worker attrib_list);
455*61046927SAndroid Build Coastguard Worker break;
456*61046927SAndroid Build Coastguard Worker #endif
457*61046927SAndroid Build Coastguard Worker case EGL_PLATFORM_SURFACELESS_MESA:
458*61046927SAndroid Build Coastguard Worker disp = _eglGetSurfacelessDisplay(native_display, attrib_list);
459*61046927SAndroid Build Coastguard Worker break;
460*61046927SAndroid Build Coastguard Worker #ifdef HAVE_ANDROID_PLATFORM
461*61046927SAndroid Build Coastguard Worker case EGL_PLATFORM_ANDROID_KHR:
462*61046927SAndroid Build Coastguard Worker disp = _eglGetAndroidDisplay(native_display, attrib_list);
463*61046927SAndroid Build Coastguard Worker break;
464*61046927SAndroid Build Coastguard Worker #endif
465*61046927SAndroid Build Coastguard Worker case EGL_PLATFORM_DEVICE_EXT:
466*61046927SAndroid Build Coastguard Worker disp = _eglGetDeviceDisplay(native_display, attrib_list);
467*61046927SAndroid Build Coastguard Worker break;
468*61046927SAndroid Build Coastguard Worker default:
469*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL);
470*61046927SAndroid Build Coastguard Worker }
471*61046927SAndroid Build Coastguard Worker
472*61046927SAndroid Build Coastguard Worker return _eglGetDisplayHandle(disp);
473*61046927SAndroid Build Coastguard Worker }
474*61046927SAndroid Build Coastguard Worker
475*61046927SAndroid Build Coastguard Worker static EGLDisplay EGLAPIENTRY
eglGetPlatformDisplayEXT(EGLenum platform,void * native_display,const EGLint * int_attribs)476*61046927SAndroid Build Coastguard Worker eglGetPlatformDisplayEXT(EGLenum platform, void *native_display,
477*61046927SAndroid Build Coastguard Worker const EGLint *int_attribs)
478*61046927SAndroid Build Coastguard Worker {
479*61046927SAndroid Build Coastguard Worker EGLAttrib *attrib_list;
480*61046927SAndroid Build Coastguard Worker EGLDisplay disp;
481*61046927SAndroid Build Coastguard Worker
482*61046927SAndroid Build Coastguard Worker #if !DETECT_OS_ANDROID
483*61046927SAndroid Build Coastguard Worker util_cpu_trace_init();
484*61046927SAndroid Build Coastguard Worker #endif
485*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL);
486*61046927SAndroid Build Coastguard Worker
487*61046927SAndroid Build Coastguard Worker if (_eglConvertIntsToAttribs(int_attribs, &attrib_list) != EGL_SUCCESS)
488*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, NULL);
489*61046927SAndroid Build Coastguard Worker
490*61046927SAndroid Build Coastguard Worker disp = _eglGetPlatformDisplayCommon(platform, native_display, attrib_list);
491*61046927SAndroid Build Coastguard Worker free(attrib_list);
492*61046927SAndroid Build Coastguard Worker return disp;
493*61046927SAndroid Build Coastguard Worker }
494*61046927SAndroid Build Coastguard Worker
495*61046927SAndroid Build Coastguard Worker PUBLIC EGLDisplay EGLAPIENTRY
eglGetPlatformDisplay(EGLenum platform,void * native_display,const EGLAttrib * attrib_list)496*61046927SAndroid Build Coastguard Worker eglGetPlatformDisplay(EGLenum platform, void *native_display,
497*61046927SAndroid Build Coastguard Worker const EGLAttrib *attrib_list)
498*61046927SAndroid Build Coastguard Worker {
499*61046927SAndroid Build Coastguard Worker #if !DETECT_OS_ANDROID
500*61046927SAndroid Build Coastguard Worker util_cpu_trace_init();
501*61046927SAndroid Build Coastguard Worker #endif
502*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL);
503*61046927SAndroid Build Coastguard Worker return _eglGetPlatformDisplayCommon(platform, native_display, attrib_list);
504*61046927SAndroid Build Coastguard Worker }
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker /**
507*61046927SAndroid Build Coastguard Worker * Copy the extension into the string and update the string pointer.
508*61046927SAndroid Build Coastguard Worker */
509*61046927SAndroid Build Coastguard Worker static EGLint
_eglAppendExtension(char ** str,const char * ext)510*61046927SAndroid Build Coastguard Worker _eglAppendExtension(char **str, const char *ext)
511*61046927SAndroid Build Coastguard Worker {
512*61046927SAndroid Build Coastguard Worker char *s = *str;
513*61046927SAndroid Build Coastguard Worker size_t len = strlen(ext);
514*61046927SAndroid Build Coastguard Worker
515*61046927SAndroid Build Coastguard Worker if (s) {
516*61046927SAndroid Build Coastguard Worker memcpy(s, ext, len);
517*61046927SAndroid Build Coastguard Worker s[len++] = ' ';
518*61046927SAndroid Build Coastguard Worker s[len] = '\0';
519*61046927SAndroid Build Coastguard Worker
520*61046927SAndroid Build Coastguard Worker *str += len;
521*61046927SAndroid Build Coastguard Worker } else {
522*61046927SAndroid Build Coastguard Worker len++;
523*61046927SAndroid Build Coastguard Worker }
524*61046927SAndroid Build Coastguard Worker
525*61046927SAndroid Build Coastguard Worker return (EGLint)len;
526*61046927SAndroid Build Coastguard Worker }
527*61046927SAndroid Build Coastguard Worker
528*61046927SAndroid Build Coastguard Worker /**
529*61046927SAndroid Build Coastguard Worker * Examine the individual extension enable/disable flags and recompute
530*61046927SAndroid Build Coastguard Worker * the driver's Extensions string.
531*61046927SAndroid Build Coastguard Worker */
532*61046927SAndroid Build Coastguard Worker static void
_eglCreateExtensionsString(_EGLDisplay * disp)533*61046927SAndroid Build Coastguard Worker _eglCreateExtensionsString(_EGLDisplay *disp)
534*61046927SAndroid Build Coastguard Worker {
535*61046927SAndroid Build Coastguard Worker #define _EGL_CHECK_EXTENSION(ext) \
536*61046927SAndroid Build Coastguard Worker do { \
537*61046927SAndroid Build Coastguard Worker if (disp->Extensions.ext) { \
538*61046927SAndroid Build Coastguard Worker _eglAppendExtension(&exts, "EGL_" #ext); \
539*61046927SAndroid Build Coastguard Worker assert(exts <= disp->ExtensionsString + _EGL_MAX_EXTENSIONS_LEN); \
540*61046927SAndroid Build Coastguard Worker } \
541*61046927SAndroid Build Coastguard Worker } while (0)
542*61046927SAndroid Build Coastguard Worker
543*61046927SAndroid Build Coastguard Worker char *exts = disp->ExtensionsString;
544*61046927SAndroid Build Coastguard Worker
545*61046927SAndroid Build Coastguard Worker /* Please keep these sorted alphabetically. */
546*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(ANDROID_blob_cache);
547*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(ANDROID_framebuffer_target);
548*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(ANDROID_image_native_buffer);
549*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(ANDROID_native_fence_sync);
550*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(ANDROID_recordable);
551*61046927SAndroid Build Coastguard Worker
552*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(CHROMIUM_sync_control);
553*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(ANGLE_sync_control_rate);
554*61046927SAndroid Build Coastguard Worker
555*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_buffer_age);
556*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_config_select_group);
557*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_create_context_robustness);
558*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import);
559*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import_modifiers);
560*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_present_opaque);
561*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_protected_content);
562*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_protected_surface);
563*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_query_reset_notification_strategy);
564*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_surface_compression);
565*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_surface_CTA861_3_metadata);
566*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_surface_SMPTE2086_metadata);
567*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage);
568*61046927SAndroid Build Coastguard Worker
569*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(IMG_context_priority);
570*61046927SAndroid Build Coastguard Worker
571*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_cl_event2);
572*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_config_attribs);
573*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_context_flush_control);
574*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_create_context);
575*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_create_context_no_error);
576*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_fence_sync);
577*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_get_all_proc_addresses);
578*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_gl_colorspace);
579*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_gl_renderbuffer_image);
580*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_gl_texture_2D_image);
581*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_gl_texture_3D_image);
582*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_gl_texture_cubemap_image);
583*61046927SAndroid Build Coastguard Worker if (disp->Extensions.KHR_image_base && disp->Extensions.KHR_image_pixmap)
584*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_image = EGL_TRUE;
585*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_image);
586*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_image_base);
587*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_image_pixmap);
588*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_mutable_render_buffer);
589*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_no_config_context);
590*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_partial_update);
591*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_reusable_sync);
592*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_surfaceless_context);
593*61046927SAndroid Build Coastguard Worker if (disp->Extensions.EXT_swap_buffers_with_damage)
594*61046927SAndroid Build Coastguard Worker _eglAppendExtension(&exts, "EGL_KHR_swap_buffers_with_damage");
595*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(EXT_pixel_format_float);
596*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(KHR_wait_sync);
597*61046927SAndroid Build Coastguard Worker
598*61046927SAndroid Build Coastguard Worker if (disp->Extensions.KHR_no_config_context)
599*61046927SAndroid Build Coastguard Worker _eglAppendExtension(&exts, "EGL_MESA_configless_context");
600*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(MESA_drm_image);
601*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(MESA_gl_interop);
602*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(MESA_image_dma_buf_export);
603*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(MESA_query_driver);
604*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(MESA_x11_native_visual_id);
605*61046927SAndroid Build Coastguard Worker
606*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(NOK_swap_region);
607*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(NOK_texture_from_pixmap);
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(NV_post_sub_buffer);
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(WL_bind_wayland_display);
612*61046927SAndroid Build Coastguard Worker _EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image);
613*61046927SAndroid Build Coastguard Worker
614*61046927SAndroid Build Coastguard Worker #undef _EGL_CHECK_EXTENSION
615*61046927SAndroid Build Coastguard Worker }
616*61046927SAndroid Build Coastguard Worker
617*61046927SAndroid Build Coastguard Worker static void
_eglCreateAPIsString(_EGLDisplay * disp)618*61046927SAndroid Build Coastguard Worker _eglCreateAPIsString(_EGLDisplay *disp)
619*61046927SAndroid Build Coastguard Worker {
620*61046927SAndroid Build Coastguard Worker #define addstr(str) \
621*61046927SAndroid Build Coastguard Worker { \
622*61046927SAndroid Build Coastguard Worker const size_t old_len = strlen(disp->ClientAPIsString); \
623*61046927SAndroid Build Coastguard Worker const size_t add_len = sizeof(str); \
624*61046927SAndroid Build Coastguard Worker const size_t max_len = sizeof(disp->ClientAPIsString) - 1; \
625*61046927SAndroid Build Coastguard Worker if (old_len + add_len <= max_len) \
626*61046927SAndroid Build Coastguard Worker strcat(disp->ClientAPIsString, str " "); \
627*61046927SAndroid Build Coastguard Worker else \
628*61046927SAndroid Build Coastguard Worker assert(!"disp->ClientAPIsString is not large enough"); \
629*61046927SAndroid Build Coastguard Worker }
630*61046927SAndroid Build Coastguard Worker
631*61046927SAndroid Build Coastguard Worker if (disp->ClientAPIs & EGL_OPENGL_BIT)
632*61046927SAndroid Build Coastguard Worker addstr("OpenGL");
633*61046927SAndroid Build Coastguard Worker
634*61046927SAndroid Build Coastguard Worker if (disp->ClientAPIs & EGL_OPENGL_ES_BIT ||
635*61046927SAndroid Build Coastguard Worker disp->ClientAPIs & EGL_OPENGL_ES2_BIT ||
636*61046927SAndroid Build Coastguard Worker disp->ClientAPIs & EGL_OPENGL_ES3_BIT_KHR) {
637*61046927SAndroid Build Coastguard Worker addstr("OpenGL_ES");
638*61046927SAndroid Build Coastguard Worker }
639*61046927SAndroid Build Coastguard Worker
640*61046927SAndroid Build Coastguard Worker if (disp->ClientAPIs & EGL_OPENVG_BIT)
641*61046927SAndroid Build Coastguard Worker addstr("OpenVG");
642*61046927SAndroid Build Coastguard Worker
643*61046927SAndroid Build Coastguard Worker #undef addstr
644*61046927SAndroid Build Coastguard Worker }
645*61046927SAndroid Build Coastguard Worker
646*61046927SAndroid Build Coastguard Worker static void
_eglComputeVersion(_EGLDisplay * disp)647*61046927SAndroid Build Coastguard Worker _eglComputeVersion(_EGLDisplay *disp)
648*61046927SAndroid Build Coastguard Worker {
649*61046927SAndroid Build Coastguard Worker disp->Version = 14;
650*61046927SAndroid Build Coastguard Worker
651*61046927SAndroid Build Coastguard Worker if (disp->Extensions.KHR_fence_sync && disp->Extensions.KHR_cl_event2 &&
652*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_wait_sync && disp->Extensions.KHR_image_base &&
653*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_gl_texture_2D_image &&
654*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_gl_texture_cubemap_image &&
655*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_gl_renderbuffer_image &&
656*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_create_context &&
657*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_get_all_proc_addresses &&
658*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_gl_colorspace &&
659*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_surfaceless_context)
660*61046927SAndroid Build Coastguard Worker disp->Version = 15;
661*61046927SAndroid Build Coastguard Worker
662*61046927SAndroid Build Coastguard Worker /* For Android P and below limit the EGL version to 1.4 */
663*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID && ANDROID_API_LEVEL <= 28
664*61046927SAndroid Build Coastguard Worker disp->Version = 14;
665*61046927SAndroid Build Coastguard Worker #endif
666*61046927SAndroid Build Coastguard Worker }
667*61046927SAndroid Build Coastguard Worker
668*61046927SAndroid Build Coastguard Worker /**
669*61046927SAndroid Build Coastguard Worker * This is typically the second EGL function that an application calls.
670*61046927SAndroid Build Coastguard Worker * Here we load/initialize the actual hardware driver.
671*61046927SAndroid Build Coastguard Worker */
672*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglInitialize(EGLDisplay dpy,EGLint * major,EGLint * minor)673*61046927SAndroid Build Coastguard Worker eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
674*61046927SAndroid Build Coastguard Worker {
675*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
676*61046927SAndroid Build Coastguard Worker
677*61046927SAndroid Build Coastguard Worker util_cpu_trace_init();
678*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
679*61046927SAndroid Build Coastguard Worker
680*61046927SAndroid Build Coastguard Worker _eglDeviceRefreshList();
681*61046927SAndroid Build Coastguard Worker
682*61046927SAndroid Build Coastguard Worker if (!disp)
683*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
684*61046927SAndroid Build Coastguard Worker
685*61046927SAndroid Build Coastguard Worker if (!disp->Initialized) {
686*61046927SAndroid Build Coastguard Worker /* set options */
687*61046927SAndroid Build Coastguard Worker disp->Options.ForceSoftware =
688*61046927SAndroid Build Coastguard Worker debug_get_bool_option("LIBGL_ALWAYS_SOFTWARE", false);
689*61046927SAndroid Build Coastguard Worker if (disp->Options.ForceSoftware)
690*61046927SAndroid Build Coastguard Worker _eglLog(_EGL_DEBUG,
691*61046927SAndroid Build Coastguard Worker "Found 'LIBGL_ALWAYS_SOFTWARE' set, will use a CPU renderer");
692*61046927SAndroid Build Coastguard Worker
693*61046927SAndroid Build Coastguard Worker const char *env = os_get_option("MESA_LOADER_DRIVER_OVERRIDE");
694*61046927SAndroid Build Coastguard Worker disp->Options.Zink = env && !strcmp(env, "zink");
695*61046927SAndroid Build Coastguard Worker
696*61046927SAndroid Build Coastguard Worker const char *gallium_hud_env = os_get_option("GALLIUM_HUD");
697*61046927SAndroid Build Coastguard Worker disp->Options.GalliumHudWarn =
698*61046927SAndroid Build Coastguard Worker gallium_hud_env && gallium_hud_env[0] != '\0';
699*61046927SAndroid Build Coastguard Worker
700*61046927SAndroid Build Coastguard Worker /**
701*61046927SAndroid Build Coastguard Worker * Initialize the display using the driver's function.
702*61046927SAndroid Build Coastguard Worker * If the initialisation fails, try again using only software rendering.
703*61046927SAndroid Build Coastguard Worker */
704*61046927SAndroid Build Coastguard Worker if (!_eglDriver.Initialize(disp)) {
705*61046927SAndroid Build Coastguard Worker if (disp->Options.ForceSoftware)
706*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
707*61046927SAndroid Build Coastguard Worker else {
708*61046927SAndroid Build Coastguard Worker bool success = false;
709*61046927SAndroid Build Coastguard Worker if (!disp->Options.Zink && !getenv("GALLIUM_DRIVER")) {
710*61046927SAndroid Build Coastguard Worker disp->Options.Zink = EGL_TRUE;
711*61046927SAndroid Build Coastguard Worker disp->Options.FallbackZink = EGL_TRUE;
712*61046927SAndroid Build Coastguard Worker success = _eglDriver.Initialize(disp);
713*61046927SAndroid Build Coastguard Worker disp->Options.FallbackZink = EGL_FALSE;
714*61046927SAndroid Build Coastguard Worker }
715*61046927SAndroid Build Coastguard Worker if (!success) {
716*61046927SAndroid Build Coastguard Worker disp->Options.Zink = EGL_FALSE;
717*61046927SAndroid Build Coastguard Worker disp->Options.ForceSoftware = EGL_TRUE;
718*61046927SAndroid Build Coastguard Worker if (!_eglDriver.Initialize(disp))
719*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
720*61046927SAndroid Build Coastguard Worker }
721*61046927SAndroid Build Coastguard Worker }
722*61046927SAndroid Build Coastguard Worker }
723*61046927SAndroid Build Coastguard Worker
724*61046927SAndroid Build Coastguard Worker disp->Initialized = EGL_TRUE;
725*61046927SAndroid Build Coastguard Worker disp->Driver = &_eglDriver;
726*61046927SAndroid Build Coastguard Worker
727*61046927SAndroid Build Coastguard Worker /* limit to APIs supported by core */
728*61046927SAndroid Build Coastguard Worker disp->ClientAPIs &= _EGL_API_ALL_BITS;
729*61046927SAndroid Build Coastguard Worker
730*61046927SAndroid Build Coastguard Worker /* EGL_KHR_get_all_proc_addresses is a corner-case extension. The spec
731*61046927SAndroid Build Coastguard Worker * classifies it as an EGL display extension, though conceptually it's an
732*61046927SAndroid Build Coastguard Worker * EGL client extension.
733*61046927SAndroid Build Coastguard Worker *
734*61046927SAndroid Build Coastguard Worker * From the EGL_KHR_get_all_proc_addresses spec:
735*61046927SAndroid Build Coastguard Worker *
736*61046927SAndroid Build Coastguard Worker * The EGL implementation must expose the name
737*61046927SAndroid Build Coastguard Worker * EGL_KHR_client_get_all_proc_addresses if and only if it exposes
738*61046927SAndroid Build Coastguard Worker * EGL_KHR_get_all_proc_addresses and supports
739*61046927SAndroid Build Coastguard Worker * EGL_EXT_client_extensions.
740*61046927SAndroid Build Coastguard Worker *
741*61046927SAndroid Build Coastguard Worker * Mesa unconditionally exposes both client extensions mentioned above,
742*61046927SAndroid Build Coastguard Worker * so the spec requires that each EGLDisplay unconditionally expose
743*61046927SAndroid Build Coastguard Worker * EGL_KHR_get_all_proc_addresses also.
744*61046927SAndroid Build Coastguard Worker */
745*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_get_all_proc_addresses = EGL_TRUE;
746*61046927SAndroid Build Coastguard Worker
747*61046927SAndroid Build Coastguard Worker /* Extensions is used to provide EGL 1.3 functionality for 1.2 aware
748*61046927SAndroid Build Coastguard Worker * programs. It is driver agnostic and handled in the main EGL code.
749*61046927SAndroid Build Coastguard Worker */
750*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_config_attribs = EGL_TRUE;
751*61046927SAndroid Build Coastguard Worker
752*61046927SAndroid Build Coastguard Worker _eglComputeVersion(disp);
753*61046927SAndroid Build Coastguard Worker _eglCreateExtensionsString(disp);
754*61046927SAndroid Build Coastguard Worker _eglCreateAPIsString(disp);
755*61046927SAndroid Build Coastguard Worker snprintf(disp->VersionString, sizeof(disp->VersionString), "%d.%d",
756*61046927SAndroid Build Coastguard Worker disp->Version / 10, disp->Version % 10);
757*61046927SAndroid Build Coastguard Worker }
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker /* Update applications version of major and minor if not NULL */
760*61046927SAndroid Build Coastguard Worker if ((major != NULL) && (minor != NULL)) {
761*61046927SAndroid Build Coastguard Worker *major = disp->Version / 10;
762*61046927SAndroid Build Coastguard Worker *minor = disp->Version % 10;
763*61046927SAndroid Build Coastguard Worker }
764*61046927SAndroid Build Coastguard Worker
765*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, EGL_TRUE);
766*61046927SAndroid Build Coastguard Worker }
767*61046927SAndroid Build Coastguard Worker
768*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglTerminate(EGLDisplay dpy)769*61046927SAndroid Build Coastguard Worker eglTerminate(EGLDisplay dpy)
770*61046927SAndroid Build Coastguard Worker {
771*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglWriteLockDisplay(dpy);
772*61046927SAndroid Build Coastguard Worker
773*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
774*61046927SAndroid Build Coastguard Worker
775*61046927SAndroid Build Coastguard Worker if (!disp)
776*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
777*61046927SAndroid Build Coastguard Worker
778*61046927SAndroid Build Coastguard Worker if (disp->Initialized) {
779*61046927SAndroid Build Coastguard Worker disp->Driver->Terminate(disp);
780*61046927SAndroid Build Coastguard Worker /* do not reset disp->Driver */
781*61046927SAndroid Build Coastguard Worker disp->ClientAPIsString[0] = 0;
782*61046927SAndroid Build Coastguard Worker disp->Initialized = EGL_FALSE;
783*61046927SAndroid Build Coastguard Worker
784*61046927SAndroid Build Coastguard Worker /* Reset blob cache funcs on terminate. */
785*61046927SAndroid Build Coastguard Worker disp->BlobCacheSet = NULL;
786*61046927SAndroid Build Coastguard Worker disp->BlobCacheGet = NULL;
787*61046927SAndroid Build Coastguard Worker }
788*61046927SAndroid Build Coastguard Worker
789*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(&disp->Mutex);
790*61046927SAndroid Build Coastguard Worker u_rwlock_wrunlock(&disp->TerminateLock);
791*61046927SAndroid Build Coastguard Worker
792*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
793*61046927SAndroid Build Coastguard Worker }
794*61046927SAndroid Build Coastguard Worker
795*61046927SAndroid Build Coastguard Worker PUBLIC const char *EGLAPIENTRY
eglQueryString(EGLDisplay dpy,EGLint name)796*61046927SAndroid Build Coastguard Worker eglQueryString(EGLDisplay dpy, EGLint name)
797*61046927SAndroid Build Coastguard Worker {
798*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp;
799*61046927SAndroid Build Coastguard Worker
800*61046927SAndroid Build Coastguard Worker #if !USE_LIBGLVND
801*61046927SAndroid Build Coastguard Worker if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) {
802*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, _eglGlobal.ClientExtensionString);
803*61046927SAndroid Build Coastguard Worker }
804*61046927SAndroid Build Coastguard Worker #endif
805*61046927SAndroid Build Coastguard Worker
806*61046927SAndroid Build Coastguard Worker disp = _eglLockDisplay(dpy);
807*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
808*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, NULL);
809*61046927SAndroid Build Coastguard Worker
810*61046927SAndroid Build Coastguard Worker switch (name) {
811*61046927SAndroid Build Coastguard Worker case EGL_VENDOR:
812*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, _EGL_VENDOR_STRING);
813*61046927SAndroid Build Coastguard Worker case EGL_VERSION:
814*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, disp->VersionString);
815*61046927SAndroid Build Coastguard Worker case EGL_EXTENSIONS:
816*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, disp->ExtensionsString);
817*61046927SAndroid Build Coastguard Worker case EGL_CLIENT_APIS:
818*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, disp->ClientAPIsString);
819*61046927SAndroid Build Coastguard Worker default:
820*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL);
821*61046927SAndroid Build Coastguard Worker }
822*61046927SAndroid Build Coastguard Worker }
823*61046927SAndroid Build Coastguard Worker
824*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglGetConfigs(EGLDisplay dpy,EGLConfig * configs,EGLint config_size,EGLint * num_config)825*61046927SAndroid Build Coastguard Worker eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size,
826*61046927SAndroid Build Coastguard Worker EGLint *num_config)
827*61046927SAndroid Build Coastguard Worker {
828*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
829*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
830*61046927SAndroid Build Coastguard Worker
831*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
832*61046927SAndroid Build Coastguard Worker
833*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
834*61046927SAndroid Build Coastguard Worker
835*61046927SAndroid Build Coastguard Worker if (!num_config)
836*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
837*61046927SAndroid Build Coastguard Worker
838*61046927SAndroid Build Coastguard Worker ret = _eglGetConfigs(disp, configs, config_size, num_config);
839*61046927SAndroid Build Coastguard Worker
840*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
841*61046927SAndroid Build Coastguard Worker }
842*61046927SAndroid Build Coastguard Worker
843*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglChooseConfig(EGLDisplay dpy,const EGLint * attrib_list,EGLConfig * configs,EGLint config_size,EGLint * num_config)844*61046927SAndroid Build Coastguard Worker eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
845*61046927SAndroid Build Coastguard Worker EGLint config_size, EGLint *num_config)
846*61046927SAndroid Build Coastguard Worker {
847*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
848*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
849*61046927SAndroid Build Coastguard Worker
850*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
851*61046927SAndroid Build Coastguard Worker
852*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
853*61046927SAndroid Build Coastguard Worker
854*61046927SAndroid Build Coastguard Worker if (!num_config)
855*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
856*61046927SAndroid Build Coastguard Worker
857*61046927SAndroid Build Coastguard Worker ret = _eglChooseConfig(disp, attrib_list, configs, config_size, num_config);
858*61046927SAndroid Build Coastguard Worker
859*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
860*61046927SAndroid Build Coastguard Worker }
861*61046927SAndroid Build Coastguard Worker
862*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglGetConfigAttrib(EGLDisplay dpy,EGLConfig config,EGLint attribute,EGLint * value)863*61046927SAndroid Build Coastguard Worker eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute,
864*61046927SAndroid Build Coastguard Worker EGLint *value)
865*61046927SAndroid Build Coastguard Worker {
866*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
867*61046927SAndroid Build Coastguard Worker _EGLConfig *conf = _eglLookupConfig(config, disp);
868*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
869*61046927SAndroid Build Coastguard Worker
870*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
871*61046927SAndroid Build Coastguard Worker
872*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE);
873*61046927SAndroid Build Coastguard Worker
874*61046927SAndroid Build Coastguard Worker ret = _eglGetConfigAttrib(disp, conf, attribute, value);
875*61046927SAndroid Build Coastguard Worker
876*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
877*61046927SAndroid Build Coastguard Worker }
878*61046927SAndroid Build Coastguard Worker
879*61046927SAndroid Build Coastguard Worker PUBLIC EGLContext EGLAPIENTRY
eglCreateContext(EGLDisplay dpy,EGLConfig config,EGLContext share_list,const EGLint * attrib_list)880*61046927SAndroid Build Coastguard Worker eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
881*61046927SAndroid Build Coastguard Worker const EGLint *attrib_list)
882*61046927SAndroid Build Coastguard Worker {
883*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
884*61046927SAndroid Build Coastguard Worker _EGLConfig *conf = _eglLookupConfig(config, disp);
885*61046927SAndroid Build Coastguard Worker _EGLContext *share = _eglLookupContext(share_list, disp);
886*61046927SAndroid Build Coastguard Worker _EGLContext *context;
887*61046927SAndroid Build Coastguard Worker EGLContext ret;
888*61046927SAndroid Build Coastguard Worker
889*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
890*61046927SAndroid Build Coastguard Worker
891*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT);
892*61046927SAndroid Build Coastguard Worker
893*61046927SAndroid Build Coastguard Worker if (config != EGL_NO_CONFIG_KHR)
894*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT);
895*61046927SAndroid Build Coastguard Worker else if (!disp->Extensions.KHR_no_config_context)
896*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT);
897*61046927SAndroid Build Coastguard Worker
898*61046927SAndroid Build Coastguard Worker if (!share && share_list != EGL_NO_CONTEXT)
899*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
900*61046927SAndroid Build Coastguard Worker else if (share && share->Resource.Display != disp) {
901*61046927SAndroid Build Coastguard Worker /* From the spec.
902*61046927SAndroid Build Coastguard Worker *
903*61046927SAndroid Build Coastguard Worker * "An EGL_BAD_MATCH error is generated if an OpenGL or OpenGL ES
904*61046927SAndroid Build Coastguard Worker * context is requested and any of: [...]
905*61046927SAndroid Build Coastguard Worker *
906*61046927SAndroid Build Coastguard Worker * * share context was created on a different display
907*61046927SAndroid Build Coastguard Worker * than the one reference by config."
908*61046927SAndroid Build Coastguard Worker */
909*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_CONTEXT);
910*61046927SAndroid Build Coastguard Worker }
911*61046927SAndroid Build Coastguard Worker
912*61046927SAndroid Build Coastguard Worker context = disp->Driver->CreateContext(disp, conf, share, attrib_list);
913*61046927SAndroid Build Coastguard Worker ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT;
914*61046927SAndroid Build Coastguard Worker
915*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
916*61046927SAndroid Build Coastguard Worker }
917*61046927SAndroid Build Coastguard Worker
918*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglDestroyContext(EGLDisplay dpy,EGLContext ctx)919*61046927SAndroid Build Coastguard Worker eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
920*61046927SAndroid Build Coastguard Worker {
921*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
922*61046927SAndroid Build Coastguard Worker _EGLContext *context = _eglLookupContext(ctx, disp);
923*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
924*61046927SAndroid Build Coastguard Worker
925*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context);
926*61046927SAndroid Build Coastguard Worker
927*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE);
928*61046927SAndroid Build Coastguard Worker _eglUnlinkContext(context);
929*61046927SAndroid Build Coastguard Worker ret = disp->Driver->DestroyContext(disp, context);
930*61046927SAndroid Build Coastguard Worker
931*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
932*61046927SAndroid Build Coastguard Worker }
933*61046927SAndroid Build Coastguard Worker
934*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglMakeCurrent(EGLDisplay dpy,EGLSurface draw,EGLSurface read,EGLContext ctx)935*61046927SAndroid Build Coastguard Worker eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
936*61046927SAndroid Build Coastguard Worker {
937*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
938*61046927SAndroid Build Coastguard Worker _EGLContext *context = _eglLookupContext(ctx, disp);
939*61046927SAndroid Build Coastguard Worker _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
940*61046927SAndroid Build Coastguard Worker _EGLSurface *read_surf = _eglLookupSurface(read, disp);
941*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
942*61046927SAndroid Build Coastguard Worker
943*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context);
944*61046927SAndroid Build Coastguard Worker
945*61046927SAndroid Build Coastguard Worker if (!disp)
946*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
947*61046927SAndroid Build Coastguard Worker
948*61046927SAndroid Build Coastguard Worker /* display is allowed to be uninitialized under certain condition */
949*61046927SAndroid Build Coastguard Worker if (!disp->Initialized) {
950*61046927SAndroid Build Coastguard Worker if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
951*61046927SAndroid Build Coastguard Worker ctx != EGL_NO_CONTEXT)
952*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
953*61046927SAndroid Build Coastguard Worker }
954*61046927SAndroid Build Coastguard Worker if (!disp->Driver)
955*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, EGL_TRUE);
956*61046927SAndroid Build Coastguard Worker
957*61046927SAndroid Build Coastguard Worker if (!context && ctx != EGL_NO_CONTEXT)
958*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
959*61046927SAndroid Build Coastguard Worker if (!draw_surf || !read_surf) {
960*61046927SAndroid Build Coastguard Worker /* From the EGL 1.4 (20130211) spec:
961*61046927SAndroid Build Coastguard Worker *
962*61046927SAndroid Build Coastguard Worker * To release the current context without assigning a new one, set ctx
963*61046927SAndroid Build Coastguard Worker * to EGL_NO_CONTEXT and set draw and read to EGL_NO_SURFACE.
964*61046927SAndroid Build Coastguard Worker */
965*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_surfaceless_context && ctx != EGL_NO_CONTEXT)
966*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
967*61046927SAndroid Build Coastguard Worker
968*61046927SAndroid Build Coastguard Worker if ((!draw_surf && draw != EGL_NO_SURFACE) ||
969*61046927SAndroid Build Coastguard Worker (!read_surf && read != EGL_NO_SURFACE))
970*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
971*61046927SAndroid Build Coastguard Worker if (draw_surf || read_surf)
972*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
973*61046927SAndroid Build Coastguard Worker }
974*61046927SAndroid Build Coastguard Worker
975*61046927SAndroid Build Coastguard Worker /* If a native window underlying either draw or read is no longer valid,
976*61046927SAndroid Build Coastguard Worker * an EGL_BAD_NATIVE_WINDOW error is generated.
977*61046927SAndroid Build Coastguard Worker */
978*61046927SAndroid Build Coastguard Worker if (draw_surf && draw_surf->Lost)
979*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_FALSE);
980*61046927SAndroid Build Coastguard Worker if (read_surf && read_surf->Lost)
981*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_FALSE);
982*61046927SAndroid Build Coastguard Worker /* EGL_EXT_protected_surface spec says:
983*61046927SAndroid Build Coastguard Worker * If EGL_PROTECTED_CONTENT_EXT attributes of read is EGL_TRUE and
984*61046927SAndroid Build Coastguard Worker * EGL_PROTECTED_CONTENT_EXT attributes of draw is EGL_FALSE, an
985*61046927SAndroid Build Coastguard Worker * EGL_BAD_ACCESS error is generated.
986*61046927SAndroid Build Coastguard Worker */
987*61046927SAndroid Build Coastguard Worker if (read_surf && read_surf->ProtectedContent && draw_surf &&
988*61046927SAndroid Build Coastguard Worker !draw_surf->ProtectedContent)
989*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ACCESS, EGL_FALSE);
990*61046927SAndroid Build Coastguard Worker
991*61046927SAndroid Build Coastguard Worker egl_relax (disp,
992*61046927SAndroid Build Coastguard Worker draw_surf ? &draw_surf->Resource : NULL,
993*61046927SAndroid Build Coastguard Worker read_surf ? &read_surf->Resource : NULL,
994*61046927SAndroid Build Coastguard Worker context ? &context->Resource : NULL) {
995*61046927SAndroid Build Coastguard Worker ret = disp->Driver->MakeCurrent(disp, draw_surf, read_surf, context);
996*61046927SAndroid Build Coastguard Worker }
997*61046927SAndroid Build Coastguard Worker
998*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
999*61046927SAndroid Build Coastguard Worker }
1000*61046927SAndroid Build Coastguard Worker
1001*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglQueryContext(EGLDisplay dpy,EGLContext ctx,EGLint attribute,EGLint * value)1002*61046927SAndroid Build Coastguard Worker eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
1003*61046927SAndroid Build Coastguard Worker {
1004*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1005*61046927SAndroid Build Coastguard Worker _EGLContext *context = _eglLookupContext(ctx, disp);
1006*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
1007*61046927SAndroid Build Coastguard Worker
1008*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context);
1009*61046927SAndroid Build Coastguard Worker
1010*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE);
1011*61046927SAndroid Build Coastguard Worker
1012*61046927SAndroid Build Coastguard Worker ret = _eglQueryContext(context, attribute, value);
1013*61046927SAndroid Build Coastguard Worker
1014*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1015*61046927SAndroid Build Coastguard Worker }
1016*61046927SAndroid Build Coastguard Worker
1017*61046927SAndroid Build Coastguard Worker /* In EGL specs 1.4 and 1.5, at the end of sections 3.5.1 and 3.5.4, it says
1018*61046927SAndroid Build Coastguard Worker * that if native_surface was already used to create a window or pixmap, we
1019*61046927SAndroid Build Coastguard Worker * can't create a new one. This is what this function checks for.
1020*61046927SAndroid Build Coastguard Worker */
1021*61046927SAndroid Build Coastguard Worker static bool
_eglNativeSurfaceAlreadyUsed(_EGLDisplay * disp,void * native_surface)1022*61046927SAndroid Build Coastguard Worker _eglNativeSurfaceAlreadyUsed(_EGLDisplay *disp, void *native_surface)
1023*61046927SAndroid Build Coastguard Worker {
1024*61046927SAndroid Build Coastguard Worker _EGLResource *list;
1025*61046927SAndroid Build Coastguard Worker
1026*61046927SAndroid Build Coastguard Worker simple_mtx_assert_locked(&disp->Mutex);
1027*61046927SAndroid Build Coastguard Worker
1028*61046927SAndroid Build Coastguard Worker list = disp->ResourceLists[_EGL_RESOURCE_SURFACE];
1029*61046927SAndroid Build Coastguard Worker while (list) {
1030*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = (_EGLSurface *)list;
1031*61046927SAndroid Build Coastguard Worker
1032*61046927SAndroid Build Coastguard Worker list = list->Next;
1033*61046927SAndroid Build Coastguard Worker
1034*61046927SAndroid Build Coastguard Worker if (surf->Type == EGL_PBUFFER_BIT)
1035*61046927SAndroid Build Coastguard Worker continue;
1036*61046927SAndroid Build Coastguard Worker
1037*61046927SAndroid Build Coastguard Worker if (surf->NativeSurface == native_surface)
1038*61046927SAndroid Build Coastguard Worker return true;
1039*61046927SAndroid Build Coastguard Worker }
1040*61046927SAndroid Build Coastguard Worker
1041*61046927SAndroid Build Coastguard Worker return false;
1042*61046927SAndroid Build Coastguard Worker }
1043*61046927SAndroid Build Coastguard Worker
1044*61046927SAndroid Build Coastguard Worker static EGLSurface
_eglCreateWindowSurfaceCommon(_EGLDisplay * disp,EGLConfig config,void * native_window,const EGLint * attrib_list)1045*61046927SAndroid Build Coastguard Worker _eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
1046*61046927SAndroid Build Coastguard Worker void *native_window, const EGLint *attrib_list)
1047*61046927SAndroid Build Coastguard Worker {
1048*61046927SAndroid Build Coastguard Worker _EGLConfig *conf = _eglLookupConfig(config, disp);
1049*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = NULL;
1050*61046927SAndroid Build Coastguard Worker EGLSurface ret;
1051*61046927SAndroid Build Coastguard Worker
1052*61046927SAndroid Build Coastguard Worker if (native_window == NULL)
1053*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
1054*61046927SAndroid Build Coastguard Worker
1055*61046927SAndroid Build Coastguard Worker if (disp && (disp->Platform == _EGL_PLATFORM_SURFACELESS ||
1056*61046927SAndroid Build Coastguard Worker disp->Platform == _EGL_PLATFORM_DEVICE)) {
1057*61046927SAndroid Build Coastguard Worker /* From the EGL_MESA_platform_surfaceless spec (v1):
1058*61046927SAndroid Build Coastguard Worker *
1059*61046927SAndroid Build Coastguard Worker * eglCreatePlatformWindowSurface fails when called with a <display>
1060*61046927SAndroid Build Coastguard Worker * that belongs to the surfaceless platform. It returns
1061*61046927SAndroid Build Coastguard Worker * EGL_NO_SURFACE and generates EGL_BAD_NATIVE_WINDOW. The
1062*61046927SAndroid Build Coastguard Worker * justification for this unconditional failure is that the
1063*61046927SAndroid Build Coastguard Worker * surfaceless platform has no native windows, and therefore the
1064*61046927SAndroid Build Coastguard Worker * <native_window> parameter is always invalid.
1065*61046927SAndroid Build Coastguard Worker *
1066*61046927SAndroid Build Coastguard Worker * This check must occur before checking the EGLConfig, which emits
1067*61046927SAndroid Build Coastguard Worker * EGL_BAD_CONFIG.
1068*61046927SAndroid Build Coastguard Worker */
1069*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
1070*61046927SAndroid Build Coastguard Worker }
1071*61046927SAndroid Build Coastguard Worker
1072*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE);
1073*61046927SAndroid Build Coastguard Worker
1074*61046927SAndroid Build Coastguard Worker if ((conf->SurfaceType & EGL_WINDOW_BIT) == 0)
1075*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE);
1076*61046927SAndroid Build Coastguard Worker
1077*61046927SAndroid Build Coastguard Worker if (_eglNativeSurfaceAlreadyUsed(disp, native_window))
1078*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
1079*61046927SAndroid Build Coastguard Worker
1080*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
1081*61046927SAndroid Build Coastguard Worker surf = disp->Driver->CreateWindowSurface(disp, conf, native_window,
1082*61046927SAndroid Build Coastguard Worker attrib_list);
1083*61046927SAndroid Build Coastguard Worker }
1084*61046927SAndroid Build Coastguard Worker ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1085*61046927SAndroid Build Coastguard Worker
1086*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1087*61046927SAndroid Build Coastguard Worker }
1088*61046927SAndroid Build Coastguard Worker
1089*61046927SAndroid Build Coastguard Worker PUBLIC EGLSurface EGLAPIENTRY
eglCreateWindowSurface(EGLDisplay dpy,EGLConfig config,EGLNativeWindowType window,const EGLint * attrib_list)1090*61046927SAndroid Build Coastguard Worker eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
1091*61046927SAndroid Build Coastguard Worker EGLNativeWindowType window, const EGLint *attrib_list)
1092*61046927SAndroid Build Coastguard Worker {
1093*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1094*61046927SAndroid Build Coastguard Worker
1095*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1096*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(void *) == sizeof(window));
1097*61046927SAndroid Build Coastguard Worker return _eglCreateWindowSurfaceCommon(disp, config, (void *)window,
1098*61046927SAndroid Build Coastguard Worker attrib_list);
1099*61046927SAndroid Build Coastguard Worker }
1100*61046927SAndroid Build Coastguard Worker
1101*61046927SAndroid Build Coastguard Worker static void *
_fixupNativeWindow(_EGLDisplay * disp,void * native_window)1102*61046927SAndroid Build Coastguard Worker _fixupNativeWindow(_EGLDisplay *disp, void *native_window)
1103*61046927SAndroid Build Coastguard Worker {
1104*61046927SAndroid Build Coastguard Worker #ifdef HAVE_X11_PLATFORM
1105*61046927SAndroid Build Coastguard Worker if (disp && disp->Platform == _EGL_PLATFORM_X11 && native_window != NULL) {
1106*61046927SAndroid Build Coastguard Worker /* The `native_window` parameter for the X11 platform differs between
1107*61046927SAndroid Build Coastguard Worker * eglCreateWindowSurface() and eglCreatePlatformPixmapSurfaceEXT(). In
1108*61046927SAndroid Build Coastguard Worker * eglCreateWindowSurface(), the type of `native_window` is an Xlib
1109*61046927SAndroid Build Coastguard Worker * `Window`. In eglCreatePlatformWindowSurfaceEXT(), the type is
1110*61046927SAndroid Build Coastguard Worker * `Window*`. Convert `Window*` to `Window` because that's what
1111*61046927SAndroid Build Coastguard Worker * dri2_x11_create_window_surface() expects.
1112*61046927SAndroid Build Coastguard Worker */
1113*61046927SAndroid Build Coastguard Worker return (void *)(*(Window *)native_window);
1114*61046927SAndroid Build Coastguard Worker }
1115*61046927SAndroid Build Coastguard Worker #endif
1116*61046927SAndroid Build Coastguard Worker #ifdef HAVE_XCB_PLATFORM
1117*61046927SAndroid Build Coastguard Worker if (disp && disp->Platform == _EGL_PLATFORM_XCB && native_window != NULL) {
1118*61046927SAndroid Build Coastguard Worker /* Similar to with X11, we need to convert (xcb_window_t *)
1119*61046927SAndroid Build Coastguard Worker * (i.e., uint32_t *) to xcb_window_t. We have to do an intermediate cast
1120*61046927SAndroid Build Coastguard Worker * to uintptr_t, since uint32_t may be smaller than a pointer.
1121*61046927SAndroid Build Coastguard Worker */
1122*61046927SAndroid Build Coastguard Worker return (void *)(uintptr_t)(*(uint32_t *)native_window);
1123*61046927SAndroid Build Coastguard Worker }
1124*61046927SAndroid Build Coastguard Worker #endif
1125*61046927SAndroid Build Coastguard Worker return native_window;
1126*61046927SAndroid Build Coastguard Worker }
1127*61046927SAndroid Build Coastguard Worker
1128*61046927SAndroid Build Coastguard Worker static EGLSurface EGLAPIENTRY
eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy,EGLConfig config,void * native_window,const EGLint * attrib_list)1129*61046927SAndroid Build Coastguard Worker eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config,
1130*61046927SAndroid Build Coastguard Worker void *native_window,
1131*61046927SAndroid Build Coastguard Worker const EGLint *attrib_list)
1132*61046927SAndroid Build Coastguard Worker {
1133*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1134*61046927SAndroid Build Coastguard Worker
1135*61046927SAndroid Build Coastguard Worker native_window = _fixupNativeWindow(disp, native_window);
1136*61046927SAndroid Build Coastguard Worker
1137*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1138*61046927SAndroid Build Coastguard Worker return _eglCreateWindowSurfaceCommon(disp, config, native_window,
1139*61046927SAndroid Build Coastguard Worker attrib_list);
1140*61046927SAndroid Build Coastguard Worker }
1141*61046927SAndroid Build Coastguard Worker
1142*61046927SAndroid Build Coastguard Worker PUBLIC EGLSurface EGLAPIENTRY
eglCreatePlatformWindowSurface(EGLDisplay dpy,EGLConfig config,void * native_window,const EGLAttrib * attrib_list)1143*61046927SAndroid Build Coastguard Worker eglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config,
1144*61046927SAndroid Build Coastguard Worker void *native_window,
1145*61046927SAndroid Build Coastguard Worker const EGLAttrib *attrib_list)
1146*61046927SAndroid Build Coastguard Worker {
1147*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1148*61046927SAndroid Build Coastguard Worker EGLSurface surface;
1149*61046927SAndroid Build Coastguard Worker EGLint *int_attribs;
1150*61046927SAndroid Build Coastguard Worker
1151*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1152*61046927SAndroid Build Coastguard Worker
1153*61046927SAndroid Build Coastguard Worker int_attribs = _eglConvertAttribsToInt(attrib_list);
1154*61046927SAndroid Build Coastguard Worker if (attrib_list && !int_attribs)
1155*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
1156*61046927SAndroid Build Coastguard Worker
1157*61046927SAndroid Build Coastguard Worker native_window = _fixupNativeWindow(disp, native_window);
1158*61046927SAndroid Build Coastguard Worker surface =
1159*61046927SAndroid Build Coastguard Worker _eglCreateWindowSurfaceCommon(disp, config, native_window, int_attribs);
1160*61046927SAndroid Build Coastguard Worker free(int_attribs);
1161*61046927SAndroid Build Coastguard Worker return surface;
1162*61046927SAndroid Build Coastguard Worker }
1163*61046927SAndroid Build Coastguard Worker
1164*61046927SAndroid Build Coastguard Worker static void *
_fixupNativePixmap(_EGLDisplay * disp,void * native_pixmap)1165*61046927SAndroid Build Coastguard Worker _fixupNativePixmap(_EGLDisplay *disp, void *native_pixmap)
1166*61046927SAndroid Build Coastguard Worker {
1167*61046927SAndroid Build Coastguard Worker #ifdef HAVE_X11_PLATFORM
1168*61046927SAndroid Build Coastguard Worker /* The `native_pixmap` parameter for the X11 platform differs between
1169*61046927SAndroid Build Coastguard Worker * eglCreatePixmapSurface() and eglCreatePlatformPixmapSurfaceEXT(). In
1170*61046927SAndroid Build Coastguard Worker * eglCreatePixmapSurface(), the type of `native_pixmap` is an Xlib
1171*61046927SAndroid Build Coastguard Worker * `Pixmap`. In eglCreatePlatformPixmapSurfaceEXT(), the type is
1172*61046927SAndroid Build Coastguard Worker * `Pixmap*`. Convert `Pixmap*` to `Pixmap` because that's what
1173*61046927SAndroid Build Coastguard Worker * dri2_x11_create_pixmap_surface() expects.
1174*61046927SAndroid Build Coastguard Worker */
1175*61046927SAndroid Build Coastguard Worker if (disp && disp->Platform == _EGL_PLATFORM_X11 && native_pixmap != NULL)
1176*61046927SAndroid Build Coastguard Worker return (void *)(*(Pixmap *)native_pixmap);
1177*61046927SAndroid Build Coastguard Worker #endif
1178*61046927SAndroid Build Coastguard Worker #ifdef HAVE_XCB_PLATFORM
1179*61046927SAndroid Build Coastguard Worker if (disp && disp->Platform == _EGL_PLATFORM_XCB && native_pixmap != NULL) {
1180*61046927SAndroid Build Coastguard Worker /* Similar to with X11, we need to convert (xcb_pixmap_t *)
1181*61046927SAndroid Build Coastguard Worker * (i.e., uint32_t *) to xcb_pixmap_t. We have to do an intermediate cast
1182*61046927SAndroid Build Coastguard Worker * to uintptr_t, since uint32_t may be smaller than a pointer.
1183*61046927SAndroid Build Coastguard Worker */
1184*61046927SAndroid Build Coastguard Worker return (void *)(uintptr_t)(*(uint32_t *)native_pixmap);
1185*61046927SAndroid Build Coastguard Worker }
1186*61046927SAndroid Build Coastguard Worker #endif
1187*61046927SAndroid Build Coastguard Worker return native_pixmap;
1188*61046927SAndroid Build Coastguard Worker }
1189*61046927SAndroid Build Coastguard Worker
1190*61046927SAndroid Build Coastguard Worker static EGLSurface
_eglCreatePixmapSurfaceCommon(_EGLDisplay * disp,EGLConfig config,void * native_pixmap,const EGLint * attrib_list)1191*61046927SAndroid Build Coastguard Worker _eglCreatePixmapSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
1192*61046927SAndroid Build Coastguard Worker void *native_pixmap, const EGLint *attrib_list)
1193*61046927SAndroid Build Coastguard Worker {
1194*61046927SAndroid Build Coastguard Worker _EGLConfig *conf = _eglLookupConfig(config, disp);
1195*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = NULL;
1196*61046927SAndroid Build Coastguard Worker EGLSurface ret;
1197*61046927SAndroid Build Coastguard Worker
1198*61046927SAndroid Build Coastguard Worker if (disp && (disp->Platform == _EGL_PLATFORM_SURFACELESS ||
1199*61046927SAndroid Build Coastguard Worker disp->Platform == _EGL_PLATFORM_DEVICE)) {
1200*61046927SAndroid Build Coastguard Worker /* From the EGL_MESA_platform_surfaceless spec (v1):
1201*61046927SAndroid Build Coastguard Worker *
1202*61046927SAndroid Build Coastguard Worker * [Like eglCreatePlatformWindowSurface,] eglCreatePlatformPixmapSurface
1203*61046927SAndroid Build Coastguard Worker * also fails when called with a <display> that belongs to the
1204*61046927SAndroid Build Coastguard Worker * surfaceless platform. It returns EGL_NO_SURFACE and generates
1205*61046927SAndroid Build Coastguard Worker * EGL_BAD_NATIVE_PIXMAP.
1206*61046927SAndroid Build Coastguard Worker *
1207*61046927SAndroid Build Coastguard Worker * This check must occur before checking the EGLConfig, which emits
1208*61046927SAndroid Build Coastguard Worker * EGL_BAD_CONFIG.
1209*61046927SAndroid Build Coastguard Worker */
1210*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
1211*61046927SAndroid Build Coastguard Worker }
1212*61046927SAndroid Build Coastguard Worker
1213*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE);
1214*61046927SAndroid Build Coastguard Worker
1215*61046927SAndroid Build Coastguard Worker if ((conf->SurfaceType & EGL_PIXMAP_BIT) == 0)
1216*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE);
1217*61046927SAndroid Build Coastguard Worker
1218*61046927SAndroid Build Coastguard Worker if (native_pixmap == NULL)
1219*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
1220*61046927SAndroid Build Coastguard Worker
1221*61046927SAndroid Build Coastguard Worker if (_eglNativeSurfaceAlreadyUsed(disp, native_pixmap))
1222*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
1223*61046927SAndroid Build Coastguard Worker
1224*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
1225*61046927SAndroid Build Coastguard Worker surf = disp->Driver->CreatePixmapSurface(disp, conf, native_pixmap,
1226*61046927SAndroid Build Coastguard Worker attrib_list);
1227*61046927SAndroid Build Coastguard Worker }
1228*61046927SAndroid Build Coastguard Worker ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1229*61046927SAndroid Build Coastguard Worker
1230*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1231*61046927SAndroid Build Coastguard Worker }
1232*61046927SAndroid Build Coastguard Worker
1233*61046927SAndroid Build Coastguard Worker PUBLIC EGLSurface EGLAPIENTRY
eglCreatePixmapSurface(EGLDisplay dpy,EGLConfig config,EGLNativePixmapType pixmap,const EGLint * attrib_list)1234*61046927SAndroid Build Coastguard Worker eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
1235*61046927SAndroid Build Coastguard Worker EGLNativePixmapType pixmap, const EGLint *attrib_list)
1236*61046927SAndroid Build Coastguard Worker {
1237*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1238*61046927SAndroid Build Coastguard Worker
1239*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1240*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(void *) == sizeof(pixmap));
1241*61046927SAndroid Build Coastguard Worker return _eglCreatePixmapSurfaceCommon(disp, config, (void *)pixmap,
1242*61046927SAndroid Build Coastguard Worker attrib_list);
1243*61046927SAndroid Build Coastguard Worker }
1244*61046927SAndroid Build Coastguard Worker
1245*61046927SAndroid Build Coastguard Worker static EGLSurface EGLAPIENTRY
eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy,EGLConfig config,void * native_pixmap,const EGLint * attrib_list)1246*61046927SAndroid Build Coastguard Worker eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config,
1247*61046927SAndroid Build Coastguard Worker void *native_pixmap,
1248*61046927SAndroid Build Coastguard Worker const EGLint *attrib_list)
1249*61046927SAndroid Build Coastguard Worker {
1250*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1251*61046927SAndroid Build Coastguard Worker
1252*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1253*61046927SAndroid Build Coastguard Worker native_pixmap = _fixupNativePixmap(disp, native_pixmap);
1254*61046927SAndroid Build Coastguard Worker return _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap,
1255*61046927SAndroid Build Coastguard Worker attrib_list);
1256*61046927SAndroid Build Coastguard Worker }
1257*61046927SAndroid Build Coastguard Worker
1258*61046927SAndroid Build Coastguard Worker PUBLIC EGLSurface EGLAPIENTRY
eglCreatePlatformPixmapSurface(EGLDisplay dpy,EGLConfig config,void * native_pixmap,const EGLAttrib * attrib_list)1259*61046927SAndroid Build Coastguard Worker eglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config,
1260*61046927SAndroid Build Coastguard Worker void *native_pixmap,
1261*61046927SAndroid Build Coastguard Worker const EGLAttrib *attrib_list)
1262*61046927SAndroid Build Coastguard Worker {
1263*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1264*61046927SAndroid Build Coastguard Worker EGLSurface surface;
1265*61046927SAndroid Build Coastguard Worker EGLint *int_attribs;
1266*61046927SAndroid Build Coastguard Worker
1267*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1268*61046927SAndroid Build Coastguard Worker
1269*61046927SAndroid Build Coastguard Worker int_attribs = _eglConvertAttribsToInt(attrib_list);
1270*61046927SAndroid Build Coastguard Worker if (attrib_list && !int_attribs)
1271*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
1272*61046927SAndroid Build Coastguard Worker
1273*61046927SAndroid Build Coastguard Worker native_pixmap = _fixupNativePixmap(disp, native_pixmap);
1274*61046927SAndroid Build Coastguard Worker surface =
1275*61046927SAndroid Build Coastguard Worker _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap, int_attribs);
1276*61046927SAndroid Build Coastguard Worker free(int_attribs);
1277*61046927SAndroid Build Coastguard Worker return surface;
1278*61046927SAndroid Build Coastguard Worker }
1279*61046927SAndroid Build Coastguard Worker
1280*61046927SAndroid Build Coastguard Worker PUBLIC EGLSurface EGLAPIENTRY
eglCreatePbufferSurface(EGLDisplay dpy,EGLConfig config,const EGLint * attrib_list)1281*61046927SAndroid Build Coastguard Worker eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
1282*61046927SAndroid Build Coastguard Worker const EGLint *attrib_list)
1283*61046927SAndroid Build Coastguard Worker {
1284*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1285*61046927SAndroid Build Coastguard Worker _EGLConfig *conf = _eglLookupConfig(config, disp);
1286*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = NULL;
1287*61046927SAndroid Build Coastguard Worker EGLSurface ret;
1288*61046927SAndroid Build Coastguard Worker
1289*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1290*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE);
1291*61046927SAndroid Build Coastguard Worker
1292*61046927SAndroid Build Coastguard Worker if ((conf->SurfaceType & EGL_PBUFFER_BIT) == 0)
1293*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE);
1294*61046927SAndroid Build Coastguard Worker
1295*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
1296*61046927SAndroid Build Coastguard Worker surf = disp->Driver->CreatePbufferSurface(disp, conf, attrib_list);
1297*61046927SAndroid Build Coastguard Worker }
1298*61046927SAndroid Build Coastguard Worker ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1299*61046927SAndroid Build Coastguard Worker
1300*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1301*61046927SAndroid Build Coastguard Worker }
1302*61046927SAndroid Build Coastguard Worker
1303*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglDestroySurface(EGLDisplay dpy,EGLSurface surface)1304*61046927SAndroid Build Coastguard Worker eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
1305*61046927SAndroid Build Coastguard Worker {
1306*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1307*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1308*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1309*61046927SAndroid Build Coastguard Worker
1310*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1311*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1312*61046927SAndroid Build Coastguard Worker _eglUnlinkSurface(surf);
1313*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
1314*61046927SAndroid Build Coastguard Worker ret = disp->Driver->DestroySurface(disp, surf);
1315*61046927SAndroid Build Coastguard Worker }
1316*61046927SAndroid Build Coastguard Worker
1317*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1318*61046927SAndroid Build Coastguard Worker }
1319*61046927SAndroid Build Coastguard Worker
1320*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglQuerySurface(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLint * value)1321*61046927SAndroid Build Coastguard Worker eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute,
1322*61046927SAndroid Build Coastguard Worker EGLint *value)
1323*61046927SAndroid Build Coastguard Worker {
1324*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1325*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1326*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
1327*61046927SAndroid Build Coastguard Worker
1328*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1329*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1330*61046927SAndroid Build Coastguard Worker
1331*61046927SAndroid Build Coastguard Worker if (disp->Driver->QuerySurface)
1332*61046927SAndroid Build Coastguard Worker ret = disp->Driver->QuerySurface(disp, surf, attribute, value);
1333*61046927SAndroid Build Coastguard Worker else
1334*61046927SAndroid Build Coastguard Worker ret = _eglQuerySurface(disp, surf, attribute, value);
1335*61046927SAndroid Build Coastguard Worker
1336*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1337*61046927SAndroid Build Coastguard Worker }
1338*61046927SAndroid Build Coastguard Worker
1339*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglSurfaceAttrib(EGLDisplay dpy,EGLSurface surface,EGLint attribute,EGLint value)1340*61046927SAndroid Build Coastguard Worker eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute,
1341*61046927SAndroid Build Coastguard Worker EGLint value)
1342*61046927SAndroid Build Coastguard Worker {
1343*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1344*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1345*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
1346*61046927SAndroid Build Coastguard Worker
1347*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1348*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1349*61046927SAndroid Build Coastguard Worker
1350*61046927SAndroid Build Coastguard Worker ret = _eglSurfaceAttrib(disp, surf, attribute, value);
1351*61046927SAndroid Build Coastguard Worker
1352*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1353*61046927SAndroid Build Coastguard Worker }
1354*61046927SAndroid Build Coastguard Worker
1355*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglBindTexImage(EGLDisplay dpy,EGLSurface surface,EGLint buffer)1356*61046927SAndroid Build Coastguard Worker eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1357*61046927SAndroid Build Coastguard Worker {
1358*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1359*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1360*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1361*61046927SAndroid Build Coastguard Worker
1362*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1363*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1364*61046927SAndroid Build Coastguard Worker
1365*61046927SAndroid Build Coastguard Worker egl_relax (disp, &surf->Resource) {
1366*61046927SAndroid Build Coastguard Worker ret = disp->Driver->BindTexImage(disp, surf, buffer);
1367*61046927SAndroid Build Coastguard Worker }
1368*61046927SAndroid Build Coastguard Worker
1369*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1370*61046927SAndroid Build Coastguard Worker }
1371*61046927SAndroid Build Coastguard Worker
1372*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglReleaseTexImage(EGLDisplay dpy,EGLSurface surface,EGLint buffer)1373*61046927SAndroid Build Coastguard Worker eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1374*61046927SAndroid Build Coastguard Worker {
1375*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1376*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1377*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1378*61046927SAndroid Build Coastguard Worker
1379*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1380*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1381*61046927SAndroid Build Coastguard Worker
1382*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
1383*61046927SAndroid Build Coastguard Worker ret = disp->Driver->ReleaseTexImage(disp, surf, buffer);
1384*61046927SAndroid Build Coastguard Worker }
1385*61046927SAndroid Build Coastguard Worker
1386*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1387*61046927SAndroid Build Coastguard Worker }
1388*61046927SAndroid Build Coastguard Worker
1389*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglSwapInterval(EGLDisplay dpy,EGLint interval)1390*61046927SAndroid Build Coastguard Worker eglSwapInterval(EGLDisplay dpy, EGLint interval)
1391*61046927SAndroid Build Coastguard Worker {
1392*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1393*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1394*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = ctx ? ctx->DrawSurface : NULL;
1395*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1396*61046927SAndroid Build Coastguard Worker
1397*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1398*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
1399*61046927SAndroid Build Coastguard Worker
1400*61046927SAndroid Build Coastguard Worker if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1401*61046927SAndroid Build Coastguard Worker ctx->Resource.Display != disp)
1402*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
1403*61046927SAndroid Build Coastguard Worker
1404*61046927SAndroid Build Coastguard Worker if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE)
1405*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
1406*61046927SAndroid Build Coastguard Worker
1407*61046927SAndroid Build Coastguard Worker if (surf->Type != EGL_WINDOW_BIT)
1408*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_TRUE);
1409*61046927SAndroid Build Coastguard Worker
1410*61046927SAndroid Build Coastguard Worker interval = CLAMP(interval, surf->Config->MinSwapInterval,
1411*61046927SAndroid Build Coastguard Worker surf->Config->MaxSwapInterval);
1412*61046927SAndroid Build Coastguard Worker
1413*61046927SAndroid Build Coastguard Worker if (surf->SwapInterval != interval && disp->Driver->SwapInterval) {
1414*61046927SAndroid Build Coastguard Worker egl_relax (disp, &surf->Resource) {
1415*61046927SAndroid Build Coastguard Worker ret = disp->Driver->SwapInterval(disp, surf, interval);
1416*61046927SAndroid Build Coastguard Worker }
1417*61046927SAndroid Build Coastguard Worker } else {
1418*61046927SAndroid Build Coastguard Worker ret = EGL_TRUE;
1419*61046927SAndroid Build Coastguard Worker }
1420*61046927SAndroid Build Coastguard Worker
1421*61046927SAndroid Build Coastguard Worker if (ret)
1422*61046927SAndroid Build Coastguard Worker surf->SwapInterval = interval;
1423*61046927SAndroid Build Coastguard Worker
1424*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1425*61046927SAndroid Build Coastguard Worker }
1426*61046927SAndroid Build Coastguard Worker
1427*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglSwapBuffers(EGLDisplay dpy,EGLSurface surface)1428*61046927SAndroid Build Coastguard Worker eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
1429*61046927SAndroid Build Coastguard Worker {
1430*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1431*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1432*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1433*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1434*61046927SAndroid Build Coastguard Worker
1435*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1436*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1437*61046927SAndroid Build Coastguard Worker
1438*61046927SAndroid Build Coastguard Worker /* surface must be bound to current context in EGL 1.4 */
1439*61046927SAndroid Build Coastguard Worker #ifndef _EGL_BUILT_IN_DRIVER_HAIKU
1440*61046927SAndroid Build Coastguard Worker if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || surf != ctx->DrawSurface)
1441*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
1442*61046927SAndroid Build Coastguard Worker #endif
1443*61046927SAndroid Build Coastguard Worker
1444*61046927SAndroid Build Coastguard Worker if (surf->Type != EGL_WINDOW_BIT)
1445*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_TRUE);
1446*61046927SAndroid Build Coastguard Worker
1447*61046927SAndroid Build Coastguard Worker /* From the EGL 1.5 spec:
1448*61046927SAndroid Build Coastguard Worker *
1449*61046927SAndroid Build Coastguard Worker * If eglSwapBuffers is called and the native window associated with
1450*61046927SAndroid Build Coastguard Worker * surface is no longer valid, an EGL_BAD_NATIVE_WINDOW error is
1451*61046927SAndroid Build Coastguard Worker * generated.
1452*61046927SAndroid Build Coastguard Worker */
1453*61046927SAndroid Build Coastguard Worker if (surf->Lost)
1454*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_FALSE);
1455*61046927SAndroid Build Coastguard Worker
1456*61046927SAndroid Build Coastguard Worker egl_relax (disp, &surf->Resource) {
1457*61046927SAndroid Build Coastguard Worker ret = disp->Driver->SwapBuffers(disp, surf);
1458*61046927SAndroid Build Coastguard Worker }
1459*61046927SAndroid Build Coastguard Worker
1460*61046927SAndroid Build Coastguard Worker /* EGL_KHR_partial_update
1461*61046927SAndroid Build Coastguard Worker * Frame boundary successfully reached,
1462*61046927SAndroid Build Coastguard Worker * reset damage region and reset BufferAgeRead
1463*61046927SAndroid Build Coastguard Worker */
1464*61046927SAndroid Build Coastguard Worker if (ret) {
1465*61046927SAndroid Build Coastguard Worker surf->SetDamageRegionCalled = EGL_FALSE;
1466*61046927SAndroid Build Coastguard Worker surf->BufferAgeRead = EGL_FALSE;
1467*61046927SAndroid Build Coastguard Worker }
1468*61046927SAndroid Build Coastguard Worker
1469*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1470*61046927SAndroid Build Coastguard Worker }
1471*61046927SAndroid Build Coastguard Worker
1472*61046927SAndroid Build Coastguard Worker static EGLBoolean
_eglSwapBuffersWithDamageCommon(_EGLDisplay * disp,_EGLSurface * surf,const EGLint * rects,EGLint n_rects)1473*61046927SAndroid Build Coastguard Worker _eglSwapBuffersWithDamageCommon(_EGLDisplay *disp, _EGLSurface *surf,
1474*61046927SAndroid Build Coastguard Worker const EGLint *rects, EGLint n_rects)
1475*61046927SAndroid Build Coastguard Worker {
1476*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1477*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1478*61046927SAndroid Build Coastguard Worker
1479*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1480*61046927SAndroid Build Coastguard Worker
1481*61046927SAndroid Build Coastguard Worker /* surface must be bound to current context in EGL 1.4 */
1482*61046927SAndroid Build Coastguard Worker if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || surf != ctx->DrawSurface)
1483*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
1484*61046927SAndroid Build Coastguard Worker
1485*61046927SAndroid Build Coastguard Worker if (surf->Type != EGL_WINDOW_BIT)
1486*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_TRUE);
1487*61046927SAndroid Build Coastguard Worker
1488*61046927SAndroid Build Coastguard Worker if ((n_rects > 0 && rects == NULL) || n_rects < 0)
1489*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1490*61046927SAndroid Build Coastguard Worker
1491*61046927SAndroid Build Coastguard Worker egl_relax (disp, &surf->Resource) {
1492*61046927SAndroid Build Coastguard Worker ret = disp->Driver->SwapBuffersWithDamageEXT(disp, surf, rects, n_rects);
1493*61046927SAndroid Build Coastguard Worker }
1494*61046927SAndroid Build Coastguard Worker
1495*61046927SAndroid Build Coastguard Worker /* EGL_KHR_partial_update
1496*61046927SAndroid Build Coastguard Worker * Frame boundary successfully reached,
1497*61046927SAndroid Build Coastguard Worker * reset damage region and reset BufferAgeRead
1498*61046927SAndroid Build Coastguard Worker */
1499*61046927SAndroid Build Coastguard Worker if (ret) {
1500*61046927SAndroid Build Coastguard Worker surf->SetDamageRegionCalled = EGL_FALSE;
1501*61046927SAndroid Build Coastguard Worker surf->BufferAgeRead = EGL_FALSE;
1502*61046927SAndroid Build Coastguard Worker }
1503*61046927SAndroid Build Coastguard Worker
1504*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1505*61046927SAndroid Build Coastguard Worker }
1506*61046927SAndroid Build Coastguard Worker
1507*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglSwapBuffersWithDamageEXT(EGLDisplay dpy,EGLSurface surface,const EGLint * rects,EGLint n_rects)1508*61046927SAndroid Build Coastguard Worker eglSwapBuffersWithDamageEXT(EGLDisplay dpy, EGLSurface surface,
1509*61046927SAndroid Build Coastguard Worker const EGLint *rects, EGLint n_rects)
1510*61046927SAndroid Build Coastguard Worker {
1511*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1512*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1513*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1514*61046927SAndroid Build Coastguard Worker return _eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects);
1515*61046927SAndroid Build Coastguard Worker }
1516*61046927SAndroid Build Coastguard Worker
1517*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglSwapBuffersWithDamageKHR(EGLDisplay dpy,EGLSurface surface,const EGLint * rects,EGLint n_rects)1518*61046927SAndroid Build Coastguard Worker eglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface,
1519*61046927SAndroid Build Coastguard Worker const EGLint *rects, EGLint n_rects)
1520*61046927SAndroid Build Coastguard Worker {
1521*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1522*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1523*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1524*61046927SAndroid Build Coastguard Worker return _eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects);
1525*61046927SAndroid Build Coastguard Worker }
1526*61046927SAndroid Build Coastguard Worker
1527*61046927SAndroid Build Coastguard Worker /**
1528*61046927SAndroid Build Coastguard Worker * Clamp the rectangles so that they lie within the surface.
1529*61046927SAndroid Build Coastguard Worker */
1530*61046927SAndroid Build Coastguard Worker
1531*61046927SAndroid Build Coastguard Worker static void
_eglSetDamageRegionKHRClampRects(_EGLSurface * surf,EGLint * rects,EGLint n_rects)1532*61046927SAndroid Build Coastguard Worker _eglSetDamageRegionKHRClampRects(_EGLSurface *surf, EGLint *rects,
1533*61046927SAndroid Build Coastguard Worker EGLint n_rects)
1534*61046927SAndroid Build Coastguard Worker {
1535*61046927SAndroid Build Coastguard Worker EGLint i;
1536*61046927SAndroid Build Coastguard Worker EGLint surf_height = surf->Height;
1537*61046927SAndroid Build Coastguard Worker EGLint surf_width = surf->Width;
1538*61046927SAndroid Build Coastguard Worker
1539*61046927SAndroid Build Coastguard Worker for (i = 0; i < (4 * n_rects); i += 4) {
1540*61046927SAndroid Build Coastguard Worker EGLint x1, y1, x2, y2;
1541*61046927SAndroid Build Coastguard Worker x1 = rects[i];
1542*61046927SAndroid Build Coastguard Worker y1 = rects[i + 1];
1543*61046927SAndroid Build Coastguard Worker x2 = rects[i + 2] + x1;
1544*61046927SAndroid Build Coastguard Worker y2 = rects[i + 3] + y1;
1545*61046927SAndroid Build Coastguard Worker
1546*61046927SAndroid Build Coastguard Worker rects[i] = CLAMP(x1, 0, surf_width);
1547*61046927SAndroid Build Coastguard Worker rects[i + 1] = CLAMP(y1, 0, surf_height);
1548*61046927SAndroid Build Coastguard Worker rects[i + 2] = CLAMP(x2, 0, surf_width) - rects[i];
1549*61046927SAndroid Build Coastguard Worker rects[i + 3] = CLAMP(y2, 0, surf_height) - rects[i + 1];
1550*61046927SAndroid Build Coastguard Worker }
1551*61046927SAndroid Build Coastguard Worker }
1552*61046927SAndroid Build Coastguard Worker
1553*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglSetDamageRegionKHR(EGLDisplay dpy,EGLSurface surface,EGLint * rects,EGLint n_rects)1554*61046927SAndroid Build Coastguard Worker eglSetDamageRegionKHR(EGLDisplay dpy, EGLSurface surface, EGLint *rects,
1555*61046927SAndroid Build Coastguard Worker EGLint n_rects)
1556*61046927SAndroid Build Coastguard Worker {
1557*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1558*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1559*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1560*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1561*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
1562*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1563*61046927SAndroid Build Coastguard Worker
1564*61046927SAndroid Build Coastguard Worker if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1565*61046927SAndroid Build Coastguard Worker surf->Type != EGL_WINDOW_BIT || ctx->DrawSurface != surf ||
1566*61046927SAndroid Build Coastguard Worker surf->SwapBehavior != EGL_BUFFER_DESTROYED)
1567*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
1568*61046927SAndroid Build Coastguard Worker
1569*61046927SAndroid Build Coastguard Worker /* If the damage region is already set or
1570*61046927SAndroid Build Coastguard Worker * buffer age is not queried between
1571*61046927SAndroid Build Coastguard Worker * frame boundaries, throw bad access error
1572*61046927SAndroid Build Coastguard Worker */
1573*61046927SAndroid Build Coastguard Worker
1574*61046927SAndroid Build Coastguard Worker if (surf->SetDamageRegionCalled || !surf->BufferAgeRead)
1575*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ACCESS, EGL_FALSE);
1576*61046927SAndroid Build Coastguard Worker
1577*61046927SAndroid Build Coastguard Worker _eglSetDamageRegionKHRClampRects(surf, rects, n_rects);
1578*61046927SAndroid Build Coastguard Worker ret = disp->Driver->SetDamageRegion(disp, surf, rects, n_rects);
1579*61046927SAndroid Build Coastguard Worker
1580*61046927SAndroid Build Coastguard Worker if (ret)
1581*61046927SAndroid Build Coastguard Worker surf->SetDamageRegionCalled = EGL_TRUE;
1582*61046927SAndroid Build Coastguard Worker
1583*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1584*61046927SAndroid Build Coastguard Worker }
1585*61046927SAndroid Build Coastguard Worker
1586*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglCopyBuffers(EGLDisplay dpy,EGLSurface surface,EGLNativePixmapType target)1587*61046927SAndroid Build Coastguard Worker eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
1588*61046927SAndroid Build Coastguard Worker {
1589*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1590*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
1591*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1592*61046927SAndroid Build Coastguard Worker void *native_pixmap_ptr;
1593*61046927SAndroid Build Coastguard Worker
1594*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
1595*61046927SAndroid Build Coastguard Worker STATIC_ASSERT(sizeof(void *) == sizeof(target));
1596*61046927SAndroid Build Coastguard Worker native_pixmap_ptr = (void *)target;
1597*61046927SAndroid Build Coastguard Worker
1598*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
1599*61046927SAndroid Build Coastguard Worker if (surf->ProtectedContent)
1600*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ACCESS, EGL_FALSE);
1601*61046927SAndroid Build Coastguard Worker
1602*61046927SAndroid Build Coastguard Worker egl_relax (disp, &surf->Resource) {
1603*61046927SAndroid Build Coastguard Worker ret = disp->Driver->CopyBuffers(disp, surf, native_pixmap_ptr);
1604*61046927SAndroid Build Coastguard Worker }
1605*61046927SAndroid Build Coastguard Worker
1606*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1607*61046927SAndroid Build Coastguard Worker }
1608*61046927SAndroid Build Coastguard Worker
1609*61046927SAndroid Build Coastguard Worker static EGLBoolean
_eglWaitClientCommon(void)1610*61046927SAndroid Build Coastguard Worker _eglWaitClientCommon(void)
1611*61046927SAndroid Build Coastguard Worker {
1612*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1613*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp;
1614*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1615*61046927SAndroid Build Coastguard Worker
1616*61046927SAndroid Build Coastguard Worker if (!ctx)
1617*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1618*61046927SAndroid Build Coastguard Worker
1619*61046927SAndroid Build Coastguard Worker disp = _eglLockDisplay(ctx->Resource.Display);
1620*61046927SAndroid Build Coastguard Worker
1621*61046927SAndroid Build Coastguard Worker /* let bad current context imply bad current surface */
1622*61046927SAndroid Build Coastguard Worker if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1623*61046927SAndroid Build Coastguard Worker _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
1624*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
1625*61046927SAndroid Build Coastguard Worker
1626*61046927SAndroid Build Coastguard Worker /* a valid current context implies an initialized current display */
1627*61046927SAndroid Build Coastguard Worker assert(disp->Initialized);
1628*61046927SAndroid Build Coastguard Worker
1629*61046927SAndroid Build Coastguard Worker egl_relax (disp, &ctx->Resource) {
1630*61046927SAndroid Build Coastguard Worker ret = disp->Driver->WaitClient(disp, ctx);
1631*61046927SAndroid Build Coastguard Worker }
1632*61046927SAndroid Build Coastguard Worker
1633*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1634*61046927SAndroid Build Coastguard Worker }
1635*61046927SAndroid Build Coastguard Worker
1636*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglWaitClient(void)1637*61046927SAndroid Build Coastguard Worker eglWaitClient(void)
1638*61046927SAndroid Build Coastguard Worker {
1639*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext());
1640*61046927SAndroid Build Coastguard Worker return _eglWaitClientCommon();
1641*61046927SAndroid Build Coastguard Worker }
1642*61046927SAndroid Build Coastguard Worker
1643*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglWaitGL(void)1644*61046927SAndroid Build Coastguard Worker eglWaitGL(void)
1645*61046927SAndroid Build Coastguard Worker {
1646*61046927SAndroid Build Coastguard Worker /* Since we only support OpenGL and GLES, eglWaitGL is equivalent to
1647*61046927SAndroid Build Coastguard Worker * eglWaitClient. */
1648*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext());
1649*61046927SAndroid Build Coastguard Worker return _eglWaitClientCommon();
1650*61046927SAndroid Build Coastguard Worker }
1651*61046927SAndroid Build Coastguard Worker
1652*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglWaitNative(EGLint engine)1653*61046927SAndroid Build Coastguard Worker eglWaitNative(EGLint engine)
1654*61046927SAndroid Build Coastguard Worker {
1655*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1656*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp;
1657*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
1658*61046927SAndroid Build Coastguard Worker
1659*61046927SAndroid Build Coastguard Worker if (!ctx)
1660*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1661*61046927SAndroid Build Coastguard Worker
1662*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL);
1663*61046927SAndroid Build Coastguard Worker
1664*61046927SAndroid Build Coastguard Worker disp = _eglLockDisplay(ctx->Resource.Display);
1665*61046927SAndroid Build Coastguard Worker
1666*61046927SAndroid Build Coastguard Worker /* let bad current context imply bad current surface */
1667*61046927SAndroid Build Coastguard Worker if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1668*61046927SAndroid Build Coastguard Worker _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
1669*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
1670*61046927SAndroid Build Coastguard Worker
1671*61046927SAndroid Build Coastguard Worker /* a valid current context implies an initialized current display */
1672*61046927SAndroid Build Coastguard Worker assert(disp->Initialized);
1673*61046927SAndroid Build Coastguard Worker
1674*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
1675*61046927SAndroid Build Coastguard Worker ret = disp->Driver->WaitNative(engine);
1676*61046927SAndroid Build Coastguard Worker }
1677*61046927SAndroid Build Coastguard Worker
1678*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1679*61046927SAndroid Build Coastguard Worker }
1680*61046927SAndroid Build Coastguard Worker
1681*61046927SAndroid Build Coastguard Worker PUBLIC EGLDisplay EGLAPIENTRY
eglGetCurrentDisplay(void)1682*61046927SAndroid Build Coastguard Worker eglGetCurrentDisplay(void)
1683*61046927SAndroid Build Coastguard Worker {
1684*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1685*61046927SAndroid Build Coastguard Worker EGLDisplay ret;
1686*61046927SAndroid Build Coastguard Worker
1687*61046927SAndroid Build Coastguard Worker ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
1688*61046927SAndroid Build Coastguard Worker
1689*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, ret);
1690*61046927SAndroid Build Coastguard Worker }
1691*61046927SAndroid Build Coastguard Worker
1692*61046927SAndroid Build Coastguard Worker PUBLIC EGLContext EGLAPIENTRY
eglGetCurrentContext(void)1693*61046927SAndroid Build Coastguard Worker eglGetCurrentContext(void)
1694*61046927SAndroid Build Coastguard Worker {
1695*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1696*61046927SAndroid Build Coastguard Worker EGLContext ret;
1697*61046927SAndroid Build Coastguard Worker
1698*61046927SAndroid Build Coastguard Worker ret = _eglGetContextHandle(ctx);
1699*61046927SAndroid Build Coastguard Worker
1700*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, ret);
1701*61046927SAndroid Build Coastguard Worker }
1702*61046927SAndroid Build Coastguard Worker
1703*61046927SAndroid Build Coastguard Worker PUBLIC EGLSurface EGLAPIENTRY
eglGetCurrentSurface(EGLint readdraw)1704*61046927SAndroid Build Coastguard Worker eglGetCurrentSurface(EGLint readdraw)
1705*61046927SAndroid Build Coastguard Worker {
1706*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1707*61046927SAndroid Build Coastguard Worker EGLint err = EGL_SUCCESS;
1708*61046927SAndroid Build Coastguard Worker _EGLSurface *surf;
1709*61046927SAndroid Build Coastguard Worker EGLSurface ret;
1710*61046927SAndroid Build Coastguard Worker
1711*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
1712*61046927SAndroid Build Coastguard Worker
1713*61046927SAndroid Build Coastguard Worker if (!ctx)
1714*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
1715*61046927SAndroid Build Coastguard Worker
1716*61046927SAndroid Build Coastguard Worker switch (readdraw) {
1717*61046927SAndroid Build Coastguard Worker case EGL_DRAW:
1718*61046927SAndroid Build Coastguard Worker surf = ctx->DrawSurface;
1719*61046927SAndroid Build Coastguard Worker break;
1720*61046927SAndroid Build Coastguard Worker case EGL_READ:
1721*61046927SAndroid Build Coastguard Worker surf = ctx->ReadSurface;
1722*61046927SAndroid Build Coastguard Worker break;
1723*61046927SAndroid Build Coastguard Worker default:
1724*61046927SAndroid Build Coastguard Worker surf = NULL;
1725*61046927SAndroid Build Coastguard Worker err = EGL_BAD_PARAMETER;
1726*61046927SAndroid Build Coastguard Worker break;
1727*61046927SAndroid Build Coastguard Worker }
1728*61046927SAndroid Build Coastguard Worker
1729*61046927SAndroid Build Coastguard Worker ret = _eglGetSurfaceHandle(surf);
1730*61046927SAndroid Build Coastguard Worker
1731*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(NULL, err, ret);
1732*61046927SAndroid Build Coastguard Worker }
1733*61046927SAndroid Build Coastguard Worker
1734*61046927SAndroid Build Coastguard Worker PUBLIC EGLint EGLAPIENTRY
eglGetError(void)1735*61046927SAndroid Build Coastguard Worker eglGetError(void)
1736*61046927SAndroid Build Coastguard Worker {
1737*61046927SAndroid Build Coastguard Worker _EGLThreadInfo *t = _eglGetCurrentThread();
1738*61046927SAndroid Build Coastguard Worker EGLint e = t->LastError;
1739*61046927SAndroid Build Coastguard Worker t->LastError = EGL_SUCCESS;
1740*61046927SAndroid Build Coastguard Worker return e;
1741*61046927SAndroid Build Coastguard Worker }
1742*61046927SAndroid Build Coastguard Worker
1743*61046927SAndroid Build Coastguard Worker /**
1744*61046927SAndroid Build Coastguard Worker ** EGL 1.2
1745*61046927SAndroid Build Coastguard Worker **/
1746*61046927SAndroid Build Coastguard Worker
1747*61046927SAndroid Build Coastguard Worker /**
1748*61046927SAndroid Build Coastguard Worker * Specify the client API to use for subsequent calls including:
1749*61046927SAndroid Build Coastguard Worker * eglCreateContext()
1750*61046927SAndroid Build Coastguard Worker * eglGetCurrentContext()
1751*61046927SAndroid Build Coastguard Worker * eglGetCurrentDisplay()
1752*61046927SAndroid Build Coastguard Worker * eglGetCurrentSurface()
1753*61046927SAndroid Build Coastguard Worker * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1754*61046927SAndroid Build Coastguard Worker * eglWaitClient()
1755*61046927SAndroid Build Coastguard Worker * eglWaitNative()
1756*61046927SAndroid Build Coastguard Worker * See section 3.7 "Rendering Context" in the EGL specification for details.
1757*61046927SAndroid Build Coastguard Worker */
1758*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglBindAPI(EGLenum api)1759*61046927SAndroid Build Coastguard Worker eglBindAPI(EGLenum api)
1760*61046927SAndroid Build Coastguard Worker {
1761*61046927SAndroid Build Coastguard Worker _EGLThreadInfo *t;
1762*61046927SAndroid Build Coastguard Worker
1763*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL);
1764*61046927SAndroid Build Coastguard Worker
1765*61046927SAndroid Build Coastguard Worker t = _eglGetCurrentThread();
1766*61046927SAndroid Build Coastguard Worker
1767*61046927SAndroid Build Coastguard Worker if (!_eglIsApiValid(api))
1768*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
1769*61046927SAndroid Build Coastguard Worker
1770*61046927SAndroid Build Coastguard Worker t->CurrentAPI = api;
1771*61046927SAndroid Build Coastguard Worker
1772*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1773*61046927SAndroid Build Coastguard Worker }
1774*61046927SAndroid Build Coastguard Worker
1775*61046927SAndroid Build Coastguard Worker /**
1776*61046927SAndroid Build Coastguard Worker * Return the last value set with eglBindAPI().
1777*61046927SAndroid Build Coastguard Worker */
1778*61046927SAndroid Build Coastguard Worker PUBLIC EGLenum EGLAPIENTRY
eglQueryAPI(void)1779*61046927SAndroid Build Coastguard Worker eglQueryAPI(void)
1780*61046927SAndroid Build Coastguard Worker {
1781*61046927SAndroid Build Coastguard Worker _EGLThreadInfo *t = _eglGetCurrentThread();
1782*61046927SAndroid Build Coastguard Worker EGLenum ret;
1783*61046927SAndroid Build Coastguard Worker
1784*61046927SAndroid Build Coastguard Worker /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
1785*61046927SAndroid Build Coastguard Worker ret = t->CurrentAPI;
1786*61046927SAndroid Build Coastguard Worker
1787*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, ret);
1788*61046927SAndroid Build Coastguard Worker }
1789*61046927SAndroid Build Coastguard Worker
1790*61046927SAndroid Build Coastguard Worker PUBLIC EGLSurface EGLAPIENTRY
eglCreatePbufferFromClientBuffer(EGLDisplay dpy,EGLenum buftype,EGLClientBuffer buffer,EGLConfig config,const EGLint * attrib_list)1791*61046927SAndroid Build Coastguard Worker eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1792*61046927SAndroid Build Coastguard Worker EGLClientBuffer buffer, EGLConfig config,
1793*61046927SAndroid Build Coastguard Worker const EGLint *attrib_list)
1794*61046927SAndroid Build Coastguard Worker {
1795*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1796*61046927SAndroid Build Coastguard Worker _EGLConfig *conf = _eglLookupConfig(config, disp);
1797*61046927SAndroid Build Coastguard Worker
1798*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1799*61046927SAndroid Build Coastguard Worker
1800*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE);
1801*61046927SAndroid Build Coastguard Worker
1802*61046927SAndroid Build Coastguard Worker /* OpenVG is not supported */
1803*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
1804*61046927SAndroid Build Coastguard Worker }
1805*61046927SAndroid Build Coastguard Worker
1806*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglReleaseThread(void)1807*61046927SAndroid Build Coastguard Worker eglReleaseThread(void)
1808*61046927SAndroid Build Coastguard Worker {
1809*61046927SAndroid Build Coastguard Worker /* unbind current contexts */
1810*61046927SAndroid Build Coastguard Worker _EGLThreadInfo *t = _eglGetCurrentThread();
1811*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = t->CurrentContext;
1812*61046927SAndroid Build Coastguard Worker
1813*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL);
1814*61046927SAndroid Build Coastguard Worker
1815*61046927SAndroid Build Coastguard Worker if (ctx) {
1816*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = ctx->Resource.Display;
1817*61046927SAndroid Build Coastguard Worker
1818*61046927SAndroid Build Coastguard Worker u_rwlock_rdlock(&disp->TerminateLock);
1819*61046927SAndroid Build Coastguard Worker (void)disp->Driver->MakeCurrent(disp, NULL, NULL, NULL);
1820*61046927SAndroid Build Coastguard Worker u_rwlock_rdunlock(&disp->TerminateLock);
1821*61046927SAndroid Build Coastguard Worker }
1822*61046927SAndroid Build Coastguard Worker
1823*61046927SAndroid Build Coastguard Worker _eglDestroyCurrentThread();
1824*61046927SAndroid Build Coastguard Worker
1825*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1826*61046927SAndroid Build Coastguard Worker }
1827*61046927SAndroid Build Coastguard Worker
1828*61046927SAndroid Build Coastguard Worker static EGLImage
_eglCreateImageCommon(_EGLDisplay * disp,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLint * attr_list)1829*61046927SAndroid Build Coastguard Worker _eglCreateImageCommon(_EGLDisplay *disp, EGLContext ctx, EGLenum target,
1830*61046927SAndroid Build Coastguard Worker EGLClientBuffer buffer, const EGLint *attr_list)
1831*61046927SAndroid Build Coastguard Worker {
1832*61046927SAndroid Build Coastguard Worker _EGLContext *context = _eglLookupContext(ctx, disp);
1833*61046927SAndroid Build Coastguard Worker _EGLImage *img = NULL;
1834*61046927SAndroid Build Coastguard Worker EGLImage ret;
1835*61046927SAndroid Build Coastguard Worker
1836*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR);
1837*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_image_base)
1838*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1839*61046927SAndroid Build Coastguard Worker if (!context && ctx != EGL_NO_CONTEXT)
1840*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1841*61046927SAndroid Build Coastguard Worker /* "If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid display,
1842*61046927SAndroid Build Coastguard Worker * <ctx> must be EGL_NO_CONTEXT..."
1843*61046927SAndroid Build Coastguard Worker */
1844*61046927SAndroid Build Coastguard Worker if (ctx != EGL_NO_CONTEXT && target == EGL_LINUX_DMA_BUF_EXT)
1845*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1846*61046927SAndroid Build Coastguard Worker
1847*61046927SAndroid Build Coastguard Worker egl_relax (disp, context ? &context->Resource : NULL) {
1848*61046927SAndroid Build Coastguard Worker img =
1849*61046927SAndroid Build Coastguard Worker disp->Driver->CreateImageKHR(disp, context, target, buffer, attr_list);
1850*61046927SAndroid Build Coastguard Worker }
1851*61046927SAndroid Build Coastguard Worker
1852*61046927SAndroid Build Coastguard Worker ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1853*61046927SAndroid Build Coastguard Worker
1854*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1855*61046927SAndroid Build Coastguard Worker }
1856*61046927SAndroid Build Coastguard Worker
1857*61046927SAndroid Build Coastguard Worker static EGLImage EGLAPIENTRY
eglCreateImageKHR(EGLDisplay dpy,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLint * attr_list)1858*61046927SAndroid Build Coastguard Worker eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1859*61046927SAndroid Build Coastguard Worker EGLClientBuffer buffer, const EGLint *attr_list)
1860*61046927SAndroid Build Coastguard Worker {
1861*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1862*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1863*61046927SAndroid Build Coastguard Worker return _eglCreateImageCommon(disp, ctx, target, buffer, attr_list);
1864*61046927SAndroid Build Coastguard Worker }
1865*61046927SAndroid Build Coastguard Worker
1866*61046927SAndroid Build Coastguard Worker PUBLIC EGLImage EGLAPIENTRY
eglCreateImage(EGLDisplay dpy,EGLContext ctx,EGLenum target,EGLClientBuffer buffer,const EGLAttrib * attr_list)1867*61046927SAndroid Build Coastguard Worker eglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1868*61046927SAndroid Build Coastguard Worker EGLClientBuffer buffer, const EGLAttrib *attr_list)
1869*61046927SAndroid Build Coastguard Worker {
1870*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1871*61046927SAndroid Build Coastguard Worker EGLImage image;
1872*61046927SAndroid Build Coastguard Worker EGLint *int_attribs;
1873*61046927SAndroid Build Coastguard Worker
1874*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1875*61046927SAndroid Build Coastguard Worker
1876*61046927SAndroid Build Coastguard Worker int_attribs = _eglConvertAttribsToInt(attr_list);
1877*61046927SAndroid Build Coastguard Worker if (attr_list && !int_attribs)
1878*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_IMAGE);
1879*61046927SAndroid Build Coastguard Worker
1880*61046927SAndroid Build Coastguard Worker image = _eglCreateImageCommon(disp, ctx, target, buffer, int_attribs);
1881*61046927SAndroid Build Coastguard Worker free(int_attribs);
1882*61046927SAndroid Build Coastguard Worker return image;
1883*61046927SAndroid Build Coastguard Worker }
1884*61046927SAndroid Build Coastguard Worker
1885*61046927SAndroid Build Coastguard Worker static EGLBoolean
_eglDestroyImageCommon(_EGLDisplay * disp,_EGLImage * img)1886*61046927SAndroid Build Coastguard Worker _eglDestroyImageCommon(_EGLDisplay *disp, _EGLImage *img)
1887*61046927SAndroid Build Coastguard Worker {
1888*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
1889*61046927SAndroid Build Coastguard Worker
1890*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
1891*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_image_base)
1892*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_FALSE);
1893*61046927SAndroid Build Coastguard Worker if (!img)
1894*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1895*61046927SAndroid Build Coastguard Worker
1896*61046927SAndroid Build Coastguard Worker _eglUnlinkImage(img);
1897*61046927SAndroid Build Coastguard Worker ret = disp->Driver->DestroyImageKHR(disp, img);
1898*61046927SAndroid Build Coastguard Worker
1899*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1900*61046927SAndroid Build Coastguard Worker }
1901*61046927SAndroid Build Coastguard Worker
1902*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglDestroyImage(EGLDisplay dpy,EGLImage image)1903*61046927SAndroid Build Coastguard Worker eglDestroyImage(EGLDisplay dpy, EGLImage image)
1904*61046927SAndroid Build Coastguard Worker {
1905*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1906*61046927SAndroid Build Coastguard Worker _EGLImage *img = _eglLookupImage(image, disp);
1907*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img);
1908*61046927SAndroid Build Coastguard Worker return _eglDestroyImageCommon(disp, img);
1909*61046927SAndroid Build Coastguard Worker }
1910*61046927SAndroid Build Coastguard Worker
1911*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglDestroyImageKHR(EGLDisplay dpy,EGLImage image)1912*61046927SAndroid Build Coastguard Worker eglDestroyImageKHR(EGLDisplay dpy, EGLImage image)
1913*61046927SAndroid Build Coastguard Worker {
1914*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1915*61046927SAndroid Build Coastguard Worker _EGLImage *img = _eglLookupImage(image, disp);
1916*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img);
1917*61046927SAndroid Build Coastguard Worker return _eglDestroyImageCommon(disp, img);
1918*61046927SAndroid Build Coastguard Worker }
1919*61046927SAndroid Build Coastguard Worker
1920*61046927SAndroid Build Coastguard Worker static EGLSync
_eglCreateSync(_EGLDisplay * disp,EGLenum type,const EGLAttrib * attrib_list,EGLBoolean orig_is_EGLAttrib,EGLenum invalid_type_error)1921*61046927SAndroid Build Coastguard Worker _eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_list,
1922*61046927SAndroid Build Coastguard Worker EGLBoolean orig_is_EGLAttrib, EGLenum invalid_type_error)
1923*61046927SAndroid Build Coastguard Worker {
1924*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
1925*61046927SAndroid Build Coastguard Worker _EGLSync *sync = NULL;
1926*61046927SAndroid Build Coastguard Worker EGLSync ret;
1927*61046927SAndroid Build Coastguard Worker
1928*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR);
1929*61046927SAndroid Build Coastguard Worker
1930*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_cl_event2 && orig_is_EGLAttrib) {
1931*61046927SAndroid Build Coastguard Worker /* There exist two EGLAttrib variants of eglCreateSync*:
1932*61046927SAndroid Build Coastguard Worker * eglCreateSync64KHR which requires EGL_KHR_cl_event2, and eglCreateSync
1933*61046927SAndroid Build Coastguard Worker * which requires EGL 1.5. Here we use the presence of EGL_KHR_cl_event2
1934*61046927SAndroid Build Coastguard Worker * support as a proxy for EGL 1.5 support, even though that's not
1935*61046927SAndroid Build Coastguard Worker * entirely correct (though _eglComputeVersion does the same).
1936*61046927SAndroid Build Coastguard Worker *
1937*61046927SAndroid Build Coastguard Worker * The EGL spec provides no guidance on how to handle unsupported
1938*61046927SAndroid Build Coastguard Worker * functions. EGL_BAD_MATCH seems reasonable.
1939*61046927SAndroid Build Coastguard Worker */
1940*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
1941*61046927SAndroid Build Coastguard Worker }
1942*61046927SAndroid Build Coastguard Worker
1943*61046927SAndroid Build Coastguard Worker /* If type is EGL_SYNC_FENCE and no context is current for the bound API
1944*61046927SAndroid Build Coastguard Worker * (i.e., eglGetCurrentContext returns EGL_NO_CONTEXT ), an EGL_BAD_MATCH
1945*61046927SAndroid Build Coastguard Worker * error is generated.
1946*61046927SAndroid Build Coastguard Worker */
1947*61046927SAndroid Build Coastguard Worker if (!ctx &&
1948*61046927SAndroid Build Coastguard Worker (type == EGL_SYNC_FENCE_KHR || type == EGL_SYNC_NATIVE_FENCE_ANDROID))
1949*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
1950*61046927SAndroid Build Coastguard Worker
1951*61046927SAndroid Build Coastguard Worker if (ctx && (ctx->Resource.Display != disp))
1952*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
1953*61046927SAndroid Build Coastguard Worker
1954*61046927SAndroid Build Coastguard Worker switch (type) {
1955*61046927SAndroid Build Coastguard Worker case EGL_SYNC_FENCE_KHR:
1956*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_fence_sync)
1957*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
1958*61046927SAndroid Build Coastguard Worker break;
1959*61046927SAndroid Build Coastguard Worker case EGL_SYNC_REUSABLE_KHR:
1960*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_reusable_sync)
1961*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
1962*61046927SAndroid Build Coastguard Worker break;
1963*61046927SAndroid Build Coastguard Worker case EGL_SYNC_CL_EVENT_KHR:
1964*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.KHR_cl_event2)
1965*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
1966*61046927SAndroid Build Coastguard Worker break;
1967*61046927SAndroid Build Coastguard Worker case EGL_SYNC_NATIVE_FENCE_ANDROID:
1968*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.ANDROID_native_fence_sync)
1969*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
1970*61046927SAndroid Build Coastguard Worker break;
1971*61046927SAndroid Build Coastguard Worker default:
1972*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
1973*61046927SAndroid Build Coastguard Worker }
1974*61046927SAndroid Build Coastguard Worker
1975*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
1976*61046927SAndroid Build Coastguard Worker sync = disp->Driver->CreateSyncKHR(disp, type, attrib_list);
1977*61046927SAndroid Build Coastguard Worker }
1978*61046927SAndroid Build Coastguard Worker
1979*61046927SAndroid Build Coastguard Worker ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
1980*61046927SAndroid Build Coastguard Worker
1981*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
1982*61046927SAndroid Build Coastguard Worker }
1983*61046927SAndroid Build Coastguard Worker
1984*61046927SAndroid Build Coastguard Worker static EGLSync EGLAPIENTRY
eglCreateSyncKHR(EGLDisplay dpy,EGLenum type,const EGLint * int_list)1985*61046927SAndroid Build Coastguard Worker eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *int_list)
1986*61046927SAndroid Build Coastguard Worker {
1987*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
1988*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
1989*61046927SAndroid Build Coastguard Worker
1990*61046927SAndroid Build Coastguard Worker EGLSync sync;
1991*61046927SAndroid Build Coastguard Worker EGLAttrib *attrib_list;
1992*61046927SAndroid Build Coastguard Worker EGLint err;
1993*61046927SAndroid Build Coastguard Worker
1994*61046927SAndroid Build Coastguard Worker if (sizeof(int_list[0]) == sizeof(attrib_list[0])) {
1995*61046927SAndroid Build Coastguard Worker attrib_list = (EGLAttrib *)int_list;
1996*61046927SAndroid Build Coastguard Worker } else {
1997*61046927SAndroid Build Coastguard Worker err = _eglConvertIntsToAttribs(int_list, &attrib_list);
1998*61046927SAndroid Build Coastguard Worker if (err != EGL_SUCCESS)
1999*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, err, EGL_NO_SYNC);
2000*61046927SAndroid Build Coastguard Worker }
2001*61046927SAndroid Build Coastguard Worker
2002*61046927SAndroid Build Coastguard Worker sync = _eglCreateSync(disp, type, attrib_list, EGL_FALSE, EGL_BAD_ATTRIBUTE);
2003*61046927SAndroid Build Coastguard Worker
2004*61046927SAndroid Build Coastguard Worker if (sizeof(int_list[0]) != sizeof(attrib_list[0]))
2005*61046927SAndroid Build Coastguard Worker free(attrib_list);
2006*61046927SAndroid Build Coastguard Worker
2007*61046927SAndroid Build Coastguard Worker /* Don't double-unlock the display. _eglCreateSync already unlocked it. */
2008*61046927SAndroid Build Coastguard Worker return sync;
2009*61046927SAndroid Build Coastguard Worker }
2010*61046927SAndroid Build Coastguard Worker
2011*61046927SAndroid Build Coastguard Worker static EGLSync EGLAPIENTRY
eglCreateSync64KHR(EGLDisplay dpy,EGLenum type,const EGLAttrib * attrib_list)2012*61046927SAndroid Build Coastguard Worker eglCreateSync64KHR(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
2013*61046927SAndroid Build Coastguard Worker {
2014*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2015*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
2016*61046927SAndroid Build Coastguard Worker return _eglCreateSync(disp, type, attrib_list, EGL_TRUE, EGL_BAD_ATTRIBUTE);
2017*61046927SAndroid Build Coastguard Worker }
2018*61046927SAndroid Build Coastguard Worker
2019*61046927SAndroid Build Coastguard Worker PUBLIC EGLSync EGLAPIENTRY
eglCreateSync(EGLDisplay dpy,EGLenum type,const EGLAttrib * attrib_list)2020*61046927SAndroid Build Coastguard Worker eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
2021*61046927SAndroid Build Coastguard Worker {
2022*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2023*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
2024*61046927SAndroid Build Coastguard Worker return _eglCreateSync(disp, type, attrib_list, EGL_TRUE, EGL_BAD_PARAMETER);
2025*61046927SAndroid Build Coastguard Worker }
2026*61046927SAndroid Build Coastguard Worker
2027*61046927SAndroid Build Coastguard Worker static EGLBoolean
_eglDestroySync(_EGLDisplay * disp,_EGLSync * s)2028*61046927SAndroid Build Coastguard Worker _eglDestroySync(_EGLDisplay *disp, _EGLSync *s)
2029*61046927SAndroid Build Coastguard Worker {
2030*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2031*61046927SAndroid Build Coastguard Worker
2032*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SYNC(disp, s, EGL_FALSE);
2033*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.KHR_reusable_sync ||
2034*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_fence_sync ||
2035*61046927SAndroid Build Coastguard Worker disp->Extensions.ANDROID_native_fence_sync);
2036*61046927SAndroid Build Coastguard Worker
2037*61046927SAndroid Build Coastguard Worker _eglUnlinkSync(s);
2038*61046927SAndroid Build Coastguard Worker
2039*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
2040*61046927SAndroid Build Coastguard Worker ret = disp->Driver->DestroySyncKHR(disp, s);
2041*61046927SAndroid Build Coastguard Worker }
2042*61046927SAndroid Build Coastguard Worker
2043*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2044*61046927SAndroid Build Coastguard Worker }
2045*61046927SAndroid Build Coastguard Worker
2046*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglDestroySync(EGLDisplay dpy,EGLSync sync)2047*61046927SAndroid Build Coastguard Worker eglDestroySync(EGLDisplay dpy, EGLSync sync)
2048*61046927SAndroid Build Coastguard Worker {
2049*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2050*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2051*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2052*61046927SAndroid Build Coastguard Worker return _eglDestroySync(disp, s);
2053*61046927SAndroid Build Coastguard Worker }
2054*61046927SAndroid Build Coastguard Worker
2055*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglDestroySyncKHR(EGLDisplay dpy,EGLSync sync)2056*61046927SAndroid Build Coastguard Worker eglDestroySyncKHR(EGLDisplay dpy, EGLSync sync)
2057*61046927SAndroid Build Coastguard Worker {
2058*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2059*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2060*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2061*61046927SAndroid Build Coastguard Worker return _eglDestroySync(disp, s);
2062*61046927SAndroid Build Coastguard Worker }
2063*61046927SAndroid Build Coastguard Worker
2064*61046927SAndroid Build Coastguard Worker static EGLint
_eglClientWaitSyncCommon(_EGLDisplay * disp,_EGLSync * s,EGLint flags,EGLTime timeout)2065*61046927SAndroid Build Coastguard Worker _eglClientWaitSyncCommon(_EGLDisplay *disp, _EGLSync *s, EGLint flags,
2066*61046927SAndroid Build Coastguard Worker EGLTime timeout)
2067*61046927SAndroid Build Coastguard Worker {
2068*61046927SAndroid Build Coastguard Worker EGLint ret = EGL_FALSE;
2069*61046927SAndroid Build Coastguard Worker
2070*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SYNC(disp, s, EGL_FALSE);
2071*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.KHR_reusable_sync ||
2072*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_fence_sync ||
2073*61046927SAndroid Build Coastguard Worker disp->Extensions.ANDROID_native_fence_sync);
2074*61046927SAndroid Build Coastguard Worker
2075*61046927SAndroid Build Coastguard Worker if (s->SyncStatus == EGL_SIGNALED_KHR)
2076*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_CONDITION_SATISFIED_KHR);
2077*61046927SAndroid Build Coastguard Worker
2078*61046927SAndroid Build Coastguard Worker egl_relax (disp, &s->Resource) {
2079*61046927SAndroid Build Coastguard Worker ret = disp->Driver->ClientWaitSyncKHR(disp, s, flags, timeout);
2080*61046927SAndroid Build Coastguard Worker }
2081*61046927SAndroid Build Coastguard Worker
2082*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2083*61046927SAndroid Build Coastguard Worker }
2084*61046927SAndroid Build Coastguard Worker
2085*61046927SAndroid Build Coastguard Worker PUBLIC EGLint EGLAPIENTRY
eglClientWaitSync(EGLDisplay dpy,EGLSync sync,EGLint flags,EGLTime timeout)2086*61046927SAndroid Build Coastguard Worker eglClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
2087*61046927SAndroid Build Coastguard Worker {
2088*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2089*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2090*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2091*61046927SAndroid Build Coastguard Worker return _eglClientWaitSyncCommon(disp, s, flags, timeout);
2092*61046927SAndroid Build Coastguard Worker }
2093*61046927SAndroid Build Coastguard Worker
2094*61046927SAndroid Build Coastguard Worker static EGLint EGLAPIENTRY
eglClientWaitSyncKHR(EGLDisplay dpy,EGLSync sync,EGLint flags,EGLTime timeout)2095*61046927SAndroid Build Coastguard Worker eglClientWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags,
2096*61046927SAndroid Build Coastguard Worker EGLTime timeout)
2097*61046927SAndroid Build Coastguard Worker {
2098*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2099*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2100*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2101*61046927SAndroid Build Coastguard Worker return _eglClientWaitSyncCommon(disp, s, flags, timeout);
2102*61046927SAndroid Build Coastguard Worker }
2103*61046927SAndroid Build Coastguard Worker
2104*61046927SAndroid Build Coastguard Worker static EGLint
_eglWaitSyncCommon(_EGLDisplay * disp,_EGLSync * s,EGLint flags)2105*61046927SAndroid Build Coastguard Worker _eglWaitSyncCommon(_EGLDisplay *disp, _EGLSync *s, EGLint flags)
2106*61046927SAndroid Build Coastguard Worker {
2107*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
2108*61046927SAndroid Build Coastguard Worker EGLint ret = EGL_FALSE;
2109*61046927SAndroid Build Coastguard Worker
2110*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SYNC(disp, s, EGL_FALSE);
2111*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.KHR_wait_sync);
2112*61046927SAndroid Build Coastguard Worker
2113*61046927SAndroid Build Coastguard Worker if (ctx == EGL_NO_CONTEXT)
2114*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
2115*61046927SAndroid Build Coastguard Worker
2116*61046927SAndroid Build Coastguard Worker /* the API doesn't allow any flags yet */
2117*61046927SAndroid Build Coastguard Worker if (flags != 0)
2118*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2119*61046927SAndroid Build Coastguard Worker
2120*61046927SAndroid Build Coastguard Worker egl_relax (disp, &s->Resource) {
2121*61046927SAndroid Build Coastguard Worker ret = disp->Driver->WaitSyncKHR(disp, s);
2122*61046927SAndroid Build Coastguard Worker }
2123*61046927SAndroid Build Coastguard Worker
2124*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2125*61046927SAndroid Build Coastguard Worker }
2126*61046927SAndroid Build Coastguard Worker
2127*61046927SAndroid Build Coastguard Worker static EGLint EGLAPIENTRY
eglWaitSyncKHR(EGLDisplay dpy,EGLSync sync,EGLint flags)2128*61046927SAndroid Build Coastguard Worker eglWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags)
2129*61046927SAndroid Build Coastguard Worker {
2130*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2131*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2132*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2133*61046927SAndroid Build Coastguard Worker return _eglWaitSyncCommon(disp, s, flags);
2134*61046927SAndroid Build Coastguard Worker }
2135*61046927SAndroid Build Coastguard Worker
2136*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglWaitSync(EGLDisplay dpy,EGLSync sync,EGLint flags)2137*61046927SAndroid Build Coastguard Worker eglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
2138*61046927SAndroid Build Coastguard Worker {
2139*61046927SAndroid Build Coastguard Worker /* The KHR version returns EGLint, while the core version returns
2140*61046927SAndroid Build Coastguard Worker * EGLBoolean. In both cases, the return values can only be EGL_FALSE and
2141*61046927SAndroid Build Coastguard Worker * EGL_TRUE.
2142*61046927SAndroid Build Coastguard Worker */
2143*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2144*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2145*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2146*61046927SAndroid Build Coastguard Worker return _eglWaitSyncCommon(disp, s, flags);
2147*61046927SAndroid Build Coastguard Worker }
2148*61046927SAndroid Build Coastguard Worker
2149*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglSignalSyncKHR(EGLDisplay dpy,EGLSync sync,EGLenum mode)2150*61046927SAndroid Build Coastguard Worker eglSignalSyncKHR(EGLDisplay dpy, EGLSync sync, EGLenum mode)
2151*61046927SAndroid Build Coastguard Worker {
2152*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2153*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2154*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2155*61046927SAndroid Build Coastguard Worker
2156*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2157*61046927SAndroid Build Coastguard Worker
2158*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SYNC(disp, s, EGL_FALSE);
2159*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.KHR_reusable_sync);
2160*61046927SAndroid Build Coastguard Worker
2161*61046927SAndroid Build Coastguard Worker egl_relax (disp, &s->Resource) {
2162*61046927SAndroid Build Coastguard Worker ret = disp->Driver->SignalSyncKHR(disp, s, mode);
2163*61046927SAndroid Build Coastguard Worker }
2164*61046927SAndroid Build Coastguard Worker
2165*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2166*61046927SAndroid Build Coastguard Worker }
2167*61046927SAndroid Build Coastguard Worker
2168*61046927SAndroid Build Coastguard Worker static EGLBoolean
_eglGetSyncAttribCommon(_EGLDisplay * disp,_EGLSync * s,EGLint attribute,EGLAttrib * value)2169*61046927SAndroid Build Coastguard Worker _eglGetSyncAttribCommon(_EGLDisplay *disp, _EGLSync *s, EGLint attribute,
2170*61046927SAndroid Build Coastguard Worker EGLAttrib *value)
2171*61046927SAndroid Build Coastguard Worker {
2172*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
2173*61046927SAndroid Build Coastguard Worker
2174*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SYNC(disp, s, EGL_FALSE);
2175*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.KHR_reusable_sync ||
2176*61046927SAndroid Build Coastguard Worker disp->Extensions.KHR_fence_sync ||
2177*61046927SAndroid Build Coastguard Worker disp->Extensions.ANDROID_native_fence_sync);
2178*61046927SAndroid Build Coastguard Worker
2179*61046927SAndroid Build Coastguard Worker ret = _eglGetSyncAttrib(disp, s, attribute, value);
2180*61046927SAndroid Build Coastguard Worker
2181*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2182*61046927SAndroid Build Coastguard Worker }
2183*61046927SAndroid Build Coastguard Worker
2184*61046927SAndroid Build Coastguard Worker PUBLIC EGLBoolean EGLAPIENTRY
eglGetSyncAttrib(EGLDisplay dpy,EGLSync sync,EGLint attribute,EGLAttrib * value)2185*61046927SAndroid Build Coastguard Worker eglGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute,
2186*61046927SAndroid Build Coastguard Worker EGLAttrib *value)
2187*61046927SAndroid Build Coastguard Worker {
2188*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2189*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2190*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2191*61046927SAndroid Build Coastguard Worker
2192*61046927SAndroid Build Coastguard Worker if (!value)
2193*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2194*61046927SAndroid Build Coastguard Worker
2195*61046927SAndroid Build Coastguard Worker return _eglGetSyncAttribCommon(disp, s, attribute, value);
2196*61046927SAndroid Build Coastguard Worker }
2197*61046927SAndroid Build Coastguard Worker
2198*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglGetSyncAttribKHR(EGLDisplay dpy,EGLSync sync,EGLint attribute,EGLint * value)2199*61046927SAndroid Build Coastguard Worker eglGetSyncAttribKHR(EGLDisplay dpy, EGLSync sync, EGLint attribute,
2200*61046927SAndroid Build Coastguard Worker EGLint *value)
2201*61046927SAndroid Build Coastguard Worker {
2202*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2203*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2204*61046927SAndroid Build Coastguard Worker EGLAttrib attrib;
2205*61046927SAndroid Build Coastguard Worker EGLBoolean result;
2206*61046927SAndroid Build Coastguard Worker
2207*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2208*61046927SAndroid Build Coastguard Worker
2209*61046927SAndroid Build Coastguard Worker if (!value)
2210*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2211*61046927SAndroid Build Coastguard Worker
2212*61046927SAndroid Build Coastguard Worker attrib = *value;
2213*61046927SAndroid Build Coastguard Worker result = _eglGetSyncAttribCommon(disp, s, attribute, &attrib);
2214*61046927SAndroid Build Coastguard Worker
2215*61046927SAndroid Build Coastguard Worker /* The EGL_KHR_fence_sync spec says this about eglGetSyncAttribKHR:
2216*61046927SAndroid Build Coastguard Worker *
2217*61046927SAndroid Build Coastguard Worker * If any error occurs, <*value> is not modified.
2218*61046927SAndroid Build Coastguard Worker */
2219*61046927SAndroid Build Coastguard Worker if (result == EGL_FALSE)
2220*61046927SAndroid Build Coastguard Worker return result;
2221*61046927SAndroid Build Coastguard Worker
2222*61046927SAndroid Build Coastguard Worker *value = attrib;
2223*61046927SAndroid Build Coastguard Worker return result;
2224*61046927SAndroid Build Coastguard Worker }
2225*61046927SAndroid Build Coastguard Worker
2226*61046927SAndroid Build Coastguard Worker static EGLint EGLAPIENTRY
eglDupNativeFenceFDANDROID(EGLDisplay dpy,EGLSync sync)2227*61046927SAndroid Build Coastguard Worker eglDupNativeFenceFDANDROID(EGLDisplay dpy, EGLSync sync)
2228*61046927SAndroid Build Coastguard Worker {
2229*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2230*61046927SAndroid Build Coastguard Worker _EGLSync *s = _eglLookupSync(sync, disp);
2231*61046927SAndroid Build Coastguard Worker EGLint ret = EGL_NO_NATIVE_FENCE_FD_ANDROID;
2232*61046927SAndroid Build Coastguard Worker
2233*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s);
2234*61046927SAndroid Build Coastguard Worker
2235*61046927SAndroid Build Coastguard Worker /* the spec doesn't seem to specify what happens if the fence
2236*61046927SAndroid Build Coastguard Worker * type is not EGL_SYNC_NATIVE_FENCE_ANDROID, but this seems
2237*61046927SAndroid Build Coastguard Worker * sensible:
2238*61046927SAndroid Build Coastguard Worker */
2239*61046927SAndroid Build Coastguard Worker if (!(s && (s->Type == EGL_SYNC_NATIVE_FENCE_ANDROID)))
2240*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_NATIVE_FENCE_FD_ANDROID);
2241*61046927SAndroid Build Coastguard Worker
2242*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SYNC(disp, s, EGL_NO_NATIVE_FENCE_FD_ANDROID);
2243*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.ANDROID_native_fence_sync);
2244*61046927SAndroid Build Coastguard Worker
2245*61046927SAndroid Build Coastguard Worker egl_relax (disp, &s->Resource) {
2246*61046927SAndroid Build Coastguard Worker ret = disp->Driver->DupNativeFenceFDANDROID(disp, s);
2247*61046927SAndroid Build Coastguard Worker }
2248*61046927SAndroid Build Coastguard Worker
2249*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, ret);
2250*61046927SAndroid Build Coastguard Worker }
2251*61046927SAndroid Build Coastguard Worker
2252*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglSwapBuffersRegionNOK(EGLDisplay dpy,EGLSurface surface,EGLint numRects,const EGLint * rects)2253*61046927SAndroid Build Coastguard Worker eglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface, EGLint numRects,
2254*61046927SAndroid Build Coastguard Worker const EGLint *rects)
2255*61046927SAndroid Build Coastguard Worker {
2256*61046927SAndroid Build Coastguard Worker _EGLContext *ctx = _eglGetCurrentContext();
2257*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2258*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
2259*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2260*61046927SAndroid Build Coastguard Worker
2261*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
2262*61046927SAndroid Build Coastguard Worker
2263*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
2264*61046927SAndroid Build Coastguard Worker
2265*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.NOK_swap_region)
2266*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_FALSE);
2267*61046927SAndroid Build Coastguard Worker
2268*61046927SAndroid Build Coastguard Worker /* surface must be bound to current context in EGL 1.4 */
2269*61046927SAndroid Build Coastguard Worker if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || surf != ctx->DrawSurface)
2270*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
2271*61046927SAndroid Build Coastguard Worker
2272*61046927SAndroid Build Coastguard Worker egl_relax (disp, &surf->Resource) {
2273*61046927SAndroid Build Coastguard Worker ret = disp->Driver->SwapBuffersRegionNOK(disp, surf, numRects, rects);
2274*61046927SAndroid Build Coastguard Worker }
2275*61046927SAndroid Build Coastguard Worker
2276*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2277*61046927SAndroid Build Coastguard Worker }
2278*61046927SAndroid Build Coastguard Worker
2279*61046927SAndroid Build Coastguard Worker static EGLImage EGLAPIENTRY
eglCreateDRMImageMESA(EGLDisplay dpy,const EGLint * attr_list)2280*61046927SAndroid Build Coastguard Worker eglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
2281*61046927SAndroid Build Coastguard Worker {
2282*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2283*61046927SAndroid Build Coastguard Worker _EGLImage *img;
2284*61046927SAndroid Build Coastguard Worker EGLImage ret;
2285*61046927SAndroid Build Coastguard Worker
2286*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
2287*61046927SAndroid Build Coastguard Worker
2288*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR);
2289*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.MESA_drm_image)
2290*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
2291*61046927SAndroid Build Coastguard Worker
2292*61046927SAndroid Build Coastguard Worker img = disp->Driver->CreateDRMImageMESA(disp, attr_list);
2293*61046927SAndroid Build Coastguard Worker ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
2294*61046927SAndroid Build Coastguard Worker
2295*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2296*61046927SAndroid Build Coastguard Worker }
2297*61046927SAndroid Build Coastguard Worker
2298*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglExportDRMImageMESA(EGLDisplay dpy,EGLImage image,EGLint * name,EGLint * handle,EGLint * stride)2299*61046927SAndroid Build Coastguard Worker eglExportDRMImageMESA(EGLDisplay dpy, EGLImage image, EGLint *name,
2300*61046927SAndroid Build Coastguard Worker EGLint *handle, EGLint *stride)
2301*61046927SAndroid Build Coastguard Worker {
2302*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2303*61046927SAndroid Build Coastguard Worker _EGLImage *img = _eglLookupImage(image, disp);
2304*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2305*61046927SAndroid Build Coastguard Worker
2306*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img);
2307*61046927SAndroid Build Coastguard Worker
2308*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2309*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.MESA_drm_image);
2310*61046927SAndroid Build Coastguard Worker
2311*61046927SAndroid Build Coastguard Worker if (!img)
2312*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2313*61046927SAndroid Build Coastguard Worker
2314*61046927SAndroid Build Coastguard Worker egl_relax (disp, &img->Resource) {
2315*61046927SAndroid Build Coastguard Worker ret = disp->Driver->ExportDRMImageMESA(disp, img, name, handle, stride);
2316*61046927SAndroid Build Coastguard Worker }
2317*61046927SAndroid Build Coastguard Worker
2318*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2319*61046927SAndroid Build Coastguard Worker }
2320*61046927SAndroid Build Coastguard Worker
2321*61046927SAndroid Build Coastguard Worker struct wl_display;
2322*61046927SAndroid Build Coastguard Worker
2323*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglBindWaylandDisplayWL(EGLDisplay dpy,struct wl_display * display)2324*61046927SAndroid Build Coastguard Worker eglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
2325*61046927SAndroid Build Coastguard Worker {
2326*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2327*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2328*61046927SAndroid Build Coastguard Worker
2329*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
2330*61046927SAndroid Build Coastguard Worker
2331*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2332*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.WL_bind_wayland_display);
2333*61046927SAndroid Build Coastguard Worker
2334*61046927SAndroid Build Coastguard Worker if (!display)
2335*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2336*61046927SAndroid Build Coastguard Worker
2337*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
2338*61046927SAndroid Build Coastguard Worker ret = disp->Driver->BindWaylandDisplayWL(disp, display);
2339*61046927SAndroid Build Coastguard Worker }
2340*61046927SAndroid Build Coastguard Worker
2341*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2342*61046927SAndroid Build Coastguard Worker }
2343*61046927SAndroid Build Coastguard Worker
2344*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglUnbindWaylandDisplayWL(EGLDisplay dpy,struct wl_display * display)2345*61046927SAndroid Build Coastguard Worker eglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
2346*61046927SAndroid Build Coastguard Worker {
2347*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2348*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2349*61046927SAndroid Build Coastguard Worker
2350*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
2351*61046927SAndroid Build Coastguard Worker
2352*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2353*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.WL_bind_wayland_display);
2354*61046927SAndroid Build Coastguard Worker
2355*61046927SAndroid Build Coastguard Worker if (!display)
2356*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2357*61046927SAndroid Build Coastguard Worker
2358*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
2359*61046927SAndroid Build Coastguard Worker ret = disp->Driver->UnbindWaylandDisplayWL(disp, display);
2360*61046927SAndroid Build Coastguard Worker }
2361*61046927SAndroid Build Coastguard Worker
2362*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2363*61046927SAndroid Build Coastguard Worker }
2364*61046927SAndroid Build Coastguard Worker
2365*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglQueryWaylandBufferWL(EGLDisplay dpy,struct wl_resource * buffer,EGLint attribute,EGLint * value)2366*61046927SAndroid Build Coastguard Worker eglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer,
2367*61046927SAndroid Build Coastguard Worker EGLint attribute, EGLint *value)
2368*61046927SAndroid Build Coastguard Worker {
2369*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2370*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2371*61046927SAndroid Build Coastguard Worker
2372*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
2373*61046927SAndroid Build Coastguard Worker
2374*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2375*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.WL_bind_wayland_display);
2376*61046927SAndroid Build Coastguard Worker
2377*61046927SAndroid Build Coastguard Worker if (!buffer)
2378*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2379*61046927SAndroid Build Coastguard Worker
2380*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
2381*61046927SAndroid Build Coastguard Worker ret = disp->Driver->QueryWaylandBufferWL(disp, buffer, attribute, value);
2382*61046927SAndroid Build Coastguard Worker }
2383*61046927SAndroid Build Coastguard Worker
2384*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2385*61046927SAndroid Build Coastguard Worker }
2386*61046927SAndroid Build Coastguard Worker
2387*61046927SAndroid Build Coastguard Worker static struct wl_buffer *EGLAPIENTRY
eglCreateWaylandBufferFromImageWL(EGLDisplay dpy,EGLImage image)2388*61046927SAndroid Build Coastguard Worker eglCreateWaylandBufferFromImageWL(EGLDisplay dpy, EGLImage image)
2389*61046927SAndroid Build Coastguard Worker {
2390*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2391*61046927SAndroid Build Coastguard Worker _EGLImage *img;
2392*61046927SAndroid Build Coastguard Worker struct wl_buffer *ret;
2393*61046927SAndroid Build Coastguard Worker
2394*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL);
2395*61046927SAndroid Build Coastguard Worker
2396*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, NULL);
2397*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.WL_create_wayland_buffer_from_image)
2398*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, NULL);
2399*61046927SAndroid Build Coastguard Worker
2400*61046927SAndroid Build Coastguard Worker img = _eglLookupImage(image, disp);
2401*61046927SAndroid Build Coastguard Worker
2402*61046927SAndroid Build Coastguard Worker if (!img)
2403*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL);
2404*61046927SAndroid Build Coastguard Worker
2405*61046927SAndroid Build Coastguard Worker ret = disp->Driver->CreateWaylandBufferFromImageWL(disp, img);
2406*61046927SAndroid Build Coastguard Worker
2407*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2408*61046927SAndroid Build Coastguard Worker }
2409*61046927SAndroid Build Coastguard Worker
2410*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglPostSubBufferNV(EGLDisplay dpy,EGLSurface surface,EGLint x,EGLint y,EGLint width,EGLint height)2411*61046927SAndroid Build Coastguard Worker eglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y,
2412*61046927SAndroid Build Coastguard Worker EGLint width, EGLint height)
2413*61046927SAndroid Build Coastguard Worker {
2414*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2415*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
2416*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2417*61046927SAndroid Build Coastguard Worker
2418*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
2419*61046927SAndroid Build Coastguard Worker
2420*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
2421*61046927SAndroid Build Coastguard Worker
2422*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.NV_post_sub_buffer)
2423*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_FALSE);
2424*61046927SAndroid Build Coastguard Worker
2425*61046927SAndroid Build Coastguard Worker egl_relax (disp, &surf->Resource) {
2426*61046927SAndroid Build Coastguard Worker ret = disp->Driver->PostSubBufferNV(disp, surf, x, y, width, height);
2427*61046927SAndroid Build Coastguard Worker }
2428*61046927SAndroid Build Coastguard Worker
2429*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2430*61046927SAndroid Build Coastguard Worker }
2431*61046927SAndroid Build Coastguard Worker
2432*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglGetSyncValuesCHROMIUM(EGLDisplay dpy,EGLSurface surface,EGLuint64KHR * ust,EGLuint64KHR * msc,EGLuint64KHR * sbc)2433*61046927SAndroid Build Coastguard Worker eglGetSyncValuesCHROMIUM(EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *ust,
2434*61046927SAndroid Build Coastguard Worker EGLuint64KHR *msc, EGLuint64KHR *sbc)
2435*61046927SAndroid Build Coastguard Worker {
2436*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2437*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
2438*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2439*61046927SAndroid Build Coastguard Worker
2440*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
2441*61046927SAndroid Build Coastguard Worker
2442*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
2443*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.CHROMIUM_sync_control)
2444*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_FALSE);
2445*61046927SAndroid Build Coastguard Worker
2446*61046927SAndroid Build Coastguard Worker if (!ust || !msc || !sbc)
2447*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2448*61046927SAndroid Build Coastguard Worker
2449*61046927SAndroid Build Coastguard Worker egl_relax (disp, &surf->Resource) {
2450*61046927SAndroid Build Coastguard Worker ret = disp->Driver->GetSyncValuesCHROMIUM(disp, surf, ust, msc, sbc);
2451*61046927SAndroid Build Coastguard Worker }
2452*61046927SAndroid Build Coastguard Worker
2453*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2454*61046927SAndroid Build Coastguard Worker }
2455*61046927SAndroid Build Coastguard Worker
2456*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglGetMscRateANGLE(EGLDisplay dpy,EGLSurface surface,EGLint * numerator,EGLint * denominator)2457*61046927SAndroid Build Coastguard Worker eglGetMscRateANGLE(EGLDisplay dpy, EGLSurface surface, EGLint *numerator,
2458*61046927SAndroid Build Coastguard Worker EGLint *denominator)
2459*61046927SAndroid Build Coastguard Worker {
2460*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2461*61046927SAndroid Build Coastguard Worker _EGLSurface *surf = _eglLookupSurface(surface, disp);
2462*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
2463*61046927SAndroid Build Coastguard Worker
2464*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf);
2465*61046927SAndroid Build Coastguard Worker
2466*61046927SAndroid Build Coastguard Worker _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE);
2467*61046927SAndroid Build Coastguard Worker if (!disp->Extensions.ANGLE_sync_control_rate)
2468*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_FALSE);
2469*61046927SAndroid Build Coastguard Worker
2470*61046927SAndroid Build Coastguard Worker if (!numerator || !denominator)
2471*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2472*61046927SAndroid Build Coastguard Worker
2473*61046927SAndroid Build Coastguard Worker ret = disp->Driver->GetMscRateANGLE(disp, surf, numerator, denominator);
2474*61046927SAndroid Build Coastguard Worker
2475*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2476*61046927SAndroid Build Coastguard Worker }
2477*61046927SAndroid Build Coastguard Worker
2478*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglExportDMABUFImageQueryMESA(EGLDisplay dpy,EGLImage image,EGLint * fourcc,EGLint * nplanes,EGLuint64KHR * modifiers)2479*61046927SAndroid Build Coastguard Worker eglExportDMABUFImageQueryMESA(EGLDisplay dpy, EGLImage image, EGLint *fourcc,
2480*61046927SAndroid Build Coastguard Worker EGLint *nplanes, EGLuint64KHR *modifiers)
2481*61046927SAndroid Build Coastguard Worker {
2482*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2483*61046927SAndroid Build Coastguard Worker _EGLImage *img = _eglLookupImage(image, disp);
2484*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2485*61046927SAndroid Build Coastguard Worker
2486*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img);
2487*61046927SAndroid Build Coastguard Worker
2488*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2489*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.MESA_image_dma_buf_export);
2490*61046927SAndroid Build Coastguard Worker
2491*61046927SAndroid Build Coastguard Worker if (!img)
2492*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2493*61046927SAndroid Build Coastguard Worker
2494*61046927SAndroid Build Coastguard Worker egl_relax (disp, &img->Resource) {
2495*61046927SAndroid Build Coastguard Worker ret = disp->Driver->ExportDMABUFImageQueryMESA(disp, img, fourcc, nplanes,
2496*61046927SAndroid Build Coastguard Worker modifiers);
2497*61046927SAndroid Build Coastguard Worker }
2498*61046927SAndroid Build Coastguard Worker
2499*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2500*61046927SAndroid Build Coastguard Worker }
2501*61046927SAndroid Build Coastguard Worker
2502*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglExportDMABUFImageMESA(EGLDisplay dpy,EGLImage image,int * fds,EGLint * strides,EGLint * offsets)2503*61046927SAndroid Build Coastguard Worker eglExportDMABUFImageMESA(EGLDisplay dpy, EGLImage image, int *fds,
2504*61046927SAndroid Build Coastguard Worker EGLint *strides, EGLint *offsets)
2505*61046927SAndroid Build Coastguard Worker {
2506*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2507*61046927SAndroid Build Coastguard Worker _EGLImage *img = _eglLookupImage(image, disp);
2508*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2509*61046927SAndroid Build Coastguard Worker
2510*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img);
2511*61046927SAndroid Build Coastguard Worker
2512*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2513*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.MESA_image_dma_buf_export);
2514*61046927SAndroid Build Coastguard Worker
2515*61046927SAndroid Build Coastguard Worker if (!img)
2516*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2517*61046927SAndroid Build Coastguard Worker
2518*61046927SAndroid Build Coastguard Worker egl_relax (disp, &img->Resource) {
2519*61046927SAndroid Build Coastguard Worker ret =
2520*61046927SAndroid Build Coastguard Worker disp->Driver->ExportDMABUFImageMESA(disp, img, fds, strides, offsets);
2521*61046927SAndroid Build Coastguard Worker }
2522*61046927SAndroid Build Coastguard Worker
2523*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2524*61046927SAndroid Build Coastguard Worker }
2525*61046927SAndroid Build Coastguard Worker
2526*61046927SAndroid Build Coastguard Worker static EGLint EGLAPIENTRY
eglLabelObjectKHR(EGLDisplay dpy,EGLenum objectType,EGLObjectKHR object,EGLLabelKHR label)2527*61046927SAndroid Build Coastguard Worker eglLabelObjectKHR(EGLDisplay dpy, EGLenum objectType, EGLObjectKHR object,
2528*61046927SAndroid Build Coastguard Worker EGLLabelKHR label)
2529*61046927SAndroid Build Coastguard Worker {
2530*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = NULL;
2531*61046927SAndroid Build Coastguard Worker _EGLResourceType type;
2532*61046927SAndroid Build Coastguard Worker
2533*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2534*61046927SAndroid Build Coastguard Worker
2535*61046927SAndroid Build Coastguard Worker if (objectType == EGL_OBJECT_THREAD_KHR) {
2536*61046927SAndroid Build Coastguard Worker _EGLThreadInfo *t = _eglGetCurrentThread();
2537*61046927SAndroid Build Coastguard Worker
2538*61046927SAndroid Build Coastguard Worker t->Label = label;
2539*61046927SAndroid Build Coastguard Worker return EGL_SUCCESS;
2540*61046927SAndroid Build Coastguard Worker }
2541*61046927SAndroid Build Coastguard Worker
2542*61046927SAndroid Build Coastguard Worker disp = _eglLockDisplay(dpy);
2543*61046927SAndroid Build Coastguard Worker if (disp == NULL)
2544*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_BAD_DISPLAY);
2545*61046927SAndroid Build Coastguard Worker
2546*61046927SAndroid Build Coastguard Worker if (objectType == EGL_OBJECT_DISPLAY_KHR) {
2547*61046927SAndroid Build Coastguard Worker if (dpy != (EGLDisplay)object)
2548*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2549*61046927SAndroid Build Coastguard Worker
2550*61046927SAndroid Build Coastguard Worker disp->Label = label;
2551*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_SUCCESS);
2552*61046927SAndroid Build Coastguard Worker }
2553*61046927SAndroid Build Coastguard Worker
2554*61046927SAndroid Build Coastguard Worker switch (objectType) {
2555*61046927SAndroid Build Coastguard Worker case EGL_OBJECT_CONTEXT_KHR:
2556*61046927SAndroid Build Coastguard Worker type = _EGL_RESOURCE_CONTEXT;
2557*61046927SAndroid Build Coastguard Worker break;
2558*61046927SAndroid Build Coastguard Worker case EGL_OBJECT_SURFACE_KHR:
2559*61046927SAndroid Build Coastguard Worker type = _EGL_RESOURCE_SURFACE;
2560*61046927SAndroid Build Coastguard Worker break;
2561*61046927SAndroid Build Coastguard Worker case EGL_OBJECT_IMAGE_KHR:
2562*61046927SAndroid Build Coastguard Worker type = _EGL_RESOURCE_IMAGE;
2563*61046927SAndroid Build Coastguard Worker break;
2564*61046927SAndroid Build Coastguard Worker case EGL_OBJECT_SYNC_KHR:
2565*61046927SAndroid Build Coastguard Worker type = _EGL_RESOURCE_SYNC;
2566*61046927SAndroid Build Coastguard Worker break;
2567*61046927SAndroid Build Coastguard Worker case EGL_OBJECT_STREAM_KHR:
2568*61046927SAndroid Build Coastguard Worker default:
2569*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2570*61046927SAndroid Build Coastguard Worker }
2571*61046927SAndroid Build Coastguard Worker
2572*61046927SAndroid Build Coastguard Worker if (_eglCheckResource(object, type, disp)) {
2573*61046927SAndroid Build Coastguard Worker _EGLResource *res = (_EGLResource *)object;
2574*61046927SAndroid Build Coastguard Worker
2575*61046927SAndroid Build Coastguard Worker res->Label = label;
2576*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, EGL_SUCCESS);
2577*61046927SAndroid Build Coastguard Worker }
2578*61046927SAndroid Build Coastguard Worker
2579*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2580*61046927SAndroid Build Coastguard Worker }
2581*61046927SAndroid Build Coastguard Worker
2582*61046927SAndroid Build Coastguard Worker static EGLint EGLAPIENTRY
eglDebugMessageControlKHR(EGLDEBUGPROCKHR callback,const EGLAttrib * attrib_list)2583*61046927SAndroid Build Coastguard Worker eglDebugMessageControlKHR(EGLDEBUGPROCKHR callback,
2584*61046927SAndroid Build Coastguard Worker const EGLAttrib *attrib_list)
2585*61046927SAndroid Build Coastguard Worker {
2586*61046927SAndroid Build Coastguard Worker unsigned int newEnabled;
2587*61046927SAndroid Build Coastguard Worker
2588*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2589*61046927SAndroid Build Coastguard Worker
2590*61046927SAndroid Build Coastguard Worker simple_mtx_lock(_eglGlobal.Mutex);
2591*61046927SAndroid Build Coastguard Worker
2592*61046927SAndroid Build Coastguard Worker newEnabled = _eglGlobal.debugTypesEnabled;
2593*61046927SAndroid Build Coastguard Worker if (attrib_list != NULL) {
2594*61046927SAndroid Build Coastguard Worker int i;
2595*61046927SAndroid Build Coastguard Worker
2596*61046927SAndroid Build Coastguard Worker for (i = 0; attrib_list[i] != EGL_NONE; i += 2) {
2597*61046927SAndroid Build Coastguard Worker switch (attrib_list[i]) {
2598*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_MSG_CRITICAL_KHR:
2599*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_MSG_ERROR_KHR:
2600*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_MSG_WARN_KHR:
2601*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_MSG_INFO_KHR:
2602*61046927SAndroid Build Coastguard Worker if (attrib_list[i + 1])
2603*61046927SAndroid Build Coastguard Worker newEnabled |= DebugBitFromType(attrib_list[i]);
2604*61046927SAndroid Build Coastguard Worker else
2605*61046927SAndroid Build Coastguard Worker newEnabled &= ~DebugBitFromType(attrib_list[i]);
2606*61046927SAndroid Build Coastguard Worker break;
2607*61046927SAndroid Build Coastguard Worker default:
2608*61046927SAndroid Build Coastguard Worker // On error, set the last error code, call the current
2609*61046927SAndroid Build Coastguard Worker // debug callback, and return the error code.
2610*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(_eglGlobal.Mutex);
2611*61046927SAndroid Build Coastguard Worker _eglDebugReport(EGL_BAD_ATTRIBUTE, NULL, EGL_DEBUG_MSG_ERROR_KHR,
2612*61046927SAndroid Build Coastguard Worker "Invalid attribute 0x%04lx",
2613*61046927SAndroid Build Coastguard Worker (unsigned long)attrib_list[i]);
2614*61046927SAndroid Build Coastguard Worker return EGL_BAD_ATTRIBUTE;
2615*61046927SAndroid Build Coastguard Worker }
2616*61046927SAndroid Build Coastguard Worker }
2617*61046927SAndroid Build Coastguard Worker }
2618*61046927SAndroid Build Coastguard Worker
2619*61046927SAndroid Build Coastguard Worker if (callback != NULL) {
2620*61046927SAndroid Build Coastguard Worker _eglGlobal.debugCallback = callback;
2621*61046927SAndroid Build Coastguard Worker _eglGlobal.debugTypesEnabled = newEnabled;
2622*61046927SAndroid Build Coastguard Worker } else {
2623*61046927SAndroid Build Coastguard Worker _eglGlobal.debugCallback = NULL;
2624*61046927SAndroid Build Coastguard Worker _eglGlobal.debugTypesEnabled =
2625*61046927SAndroid Build Coastguard Worker _EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR;
2626*61046927SAndroid Build Coastguard Worker }
2627*61046927SAndroid Build Coastguard Worker
2628*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(_eglGlobal.Mutex);
2629*61046927SAndroid Build Coastguard Worker return EGL_SUCCESS;
2630*61046927SAndroid Build Coastguard Worker }
2631*61046927SAndroid Build Coastguard Worker
2632*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglQueryDebugKHR(EGLint attribute,EGLAttrib * value)2633*61046927SAndroid Build Coastguard Worker eglQueryDebugKHR(EGLint attribute, EGLAttrib *value)
2634*61046927SAndroid Build Coastguard Worker {
2635*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2636*61046927SAndroid Build Coastguard Worker
2637*61046927SAndroid Build Coastguard Worker simple_mtx_lock(_eglGlobal.Mutex);
2638*61046927SAndroid Build Coastguard Worker
2639*61046927SAndroid Build Coastguard Worker switch (attribute) {
2640*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_MSG_CRITICAL_KHR:
2641*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_MSG_ERROR_KHR:
2642*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_MSG_WARN_KHR:
2643*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_MSG_INFO_KHR:
2644*61046927SAndroid Build Coastguard Worker if (_eglGlobal.debugTypesEnabled & DebugBitFromType(attribute))
2645*61046927SAndroid Build Coastguard Worker *value = EGL_TRUE;
2646*61046927SAndroid Build Coastguard Worker else
2647*61046927SAndroid Build Coastguard Worker *value = EGL_FALSE;
2648*61046927SAndroid Build Coastguard Worker break;
2649*61046927SAndroid Build Coastguard Worker case EGL_DEBUG_CALLBACK_KHR:
2650*61046927SAndroid Build Coastguard Worker *value = (EGLAttrib)_eglGlobal.debugCallback;
2651*61046927SAndroid Build Coastguard Worker break;
2652*61046927SAndroid Build Coastguard Worker default:
2653*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(_eglGlobal.Mutex);
2654*61046927SAndroid Build Coastguard Worker _eglDebugReport(EGL_BAD_ATTRIBUTE, NULL, EGL_DEBUG_MSG_ERROR_KHR,
2655*61046927SAndroid Build Coastguard Worker "Invalid attribute 0x%04lx", (unsigned long)attribute);
2656*61046927SAndroid Build Coastguard Worker return EGL_FALSE;
2657*61046927SAndroid Build Coastguard Worker }
2658*61046927SAndroid Build Coastguard Worker
2659*61046927SAndroid Build Coastguard Worker simple_mtx_unlock(_eglGlobal.Mutex);
2660*61046927SAndroid Build Coastguard Worker return EGL_TRUE;
2661*61046927SAndroid Build Coastguard Worker }
2662*61046927SAndroid Build Coastguard Worker
2663*61046927SAndroid Build Coastguard Worker static int
_eglFunctionCompare(const void * key,const void * elem)2664*61046927SAndroid Build Coastguard Worker _eglFunctionCompare(const void *key, const void *elem)
2665*61046927SAndroid Build Coastguard Worker {
2666*61046927SAndroid Build Coastguard Worker const char *procname = key;
2667*61046927SAndroid Build Coastguard Worker const struct _egl_entrypoint *entrypoint = elem;
2668*61046927SAndroid Build Coastguard Worker return strcmp(procname, entrypoint->name);
2669*61046927SAndroid Build Coastguard Worker }
2670*61046927SAndroid Build Coastguard Worker
2671*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglQueryDmaBufFormatsEXT(EGLDisplay dpy,EGLint max_formats,EGLint * formats,EGLint * num_formats)2672*61046927SAndroid Build Coastguard Worker eglQueryDmaBufFormatsEXT(EGLDisplay dpy, EGLint max_formats, EGLint *formats,
2673*61046927SAndroid Build Coastguard Worker EGLint *num_formats)
2674*61046927SAndroid Build Coastguard Worker {
2675*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2676*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2677*61046927SAndroid Build Coastguard Worker
2678*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2679*61046927SAndroid Build Coastguard Worker
2680*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2681*61046927SAndroid Build Coastguard Worker
2682*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
2683*61046927SAndroid Build Coastguard Worker ret = disp->Driver->QueryDmaBufFormatsEXT(disp, max_formats, formats,
2684*61046927SAndroid Build Coastguard Worker num_formats);
2685*61046927SAndroid Build Coastguard Worker }
2686*61046927SAndroid Build Coastguard Worker
2687*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2688*61046927SAndroid Build Coastguard Worker }
2689*61046927SAndroid Build Coastguard Worker
2690*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglQueryDmaBufModifiersEXT(EGLDisplay dpy,EGLint format,EGLint max_modifiers,EGLuint64KHR * modifiers,EGLBoolean * external_only,EGLint * num_modifiers)2691*61046927SAndroid Build Coastguard Worker eglQueryDmaBufModifiersEXT(EGLDisplay dpy, EGLint format, EGLint max_modifiers,
2692*61046927SAndroid Build Coastguard Worker EGLuint64KHR *modifiers, EGLBoolean *external_only,
2693*61046927SAndroid Build Coastguard Worker EGLint *num_modifiers)
2694*61046927SAndroid Build Coastguard Worker {
2695*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2696*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2697*61046927SAndroid Build Coastguard Worker
2698*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2699*61046927SAndroid Build Coastguard Worker
2700*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2701*61046927SAndroid Build Coastguard Worker
2702*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
2703*61046927SAndroid Build Coastguard Worker ret = disp->Driver->QueryDmaBufModifiersEXT(
2704*61046927SAndroid Build Coastguard Worker disp, format, max_modifiers, modifiers, external_only, num_modifiers);
2705*61046927SAndroid Build Coastguard Worker }
2706*61046927SAndroid Build Coastguard Worker
2707*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2708*61046927SAndroid Build Coastguard Worker }
2709*61046927SAndroid Build Coastguard Worker
2710*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglQuerySupportedCompressionRatesEXT(EGLDisplay dpy,EGLConfig config,const EGLAttrib * attrib_list,EGLint * rates,EGLint rate_size,EGLint * num_rates)2711*61046927SAndroid Build Coastguard Worker eglQuerySupportedCompressionRatesEXT(EGLDisplay dpy, EGLConfig config,
2712*61046927SAndroid Build Coastguard Worker const EGLAttrib *attrib_list,
2713*61046927SAndroid Build Coastguard Worker EGLint *rates, EGLint rate_size,
2714*61046927SAndroid Build Coastguard Worker EGLint *num_rates)
2715*61046927SAndroid Build Coastguard Worker {
2716*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2717*61046927SAndroid Build Coastguard Worker _EGLConfig *conf = _eglLookupConfig(config, disp);
2718*61046927SAndroid Build Coastguard Worker EGLBoolean ret = EGL_FALSE;
2719*61046927SAndroid Build Coastguard Worker
2720*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2721*61046927SAndroid Build Coastguard Worker
2722*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2723*61046927SAndroid Build Coastguard Worker _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE);
2724*61046927SAndroid Build Coastguard Worker
2725*61046927SAndroid Build Coastguard Worker egl_relax (disp) {
2726*61046927SAndroid Build Coastguard Worker if (disp->Driver->QuerySupportedCompressionRatesEXT) {
2727*61046927SAndroid Build Coastguard Worker ret = disp->Driver->QuerySupportedCompressionRatesEXT(
2728*61046927SAndroid Build Coastguard Worker disp, conf, attrib_list, rates, rate_size, num_rates);
2729*61046927SAndroid Build Coastguard Worker } else {
2730*61046927SAndroid Build Coastguard Worker *num_rates = 0;
2731*61046927SAndroid Build Coastguard Worker ret = EGL_TRUE;
2732*61046927SAndroid Build Coastguard Worker }
2733*61046927SAndroid Build Coastguard Worker }
2734*61046927SAndroid Build Coastguard Worker
2735*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2736*61046927SAndroid Build Coastguard Worker }
2737*61046927SAndroid Build Coastguard Worker
2738*61046927SAndroid Build Coastguard Worker static void EGLAPIENTRY
eglSetBlobCacheFuncsANDROID(EGLDisplay * dpy,EGLSetBlobFuncANDROID set,EGLGetBlobFuncANDROID get)2739*61046927SAndroid Build Coastguard Worker eglSetBlobCacheFuncsANDROID(EGLDisplay *dpy, EGLSetBlobFuncANDROID set,
2740*61046927SAndroid Build Coastguard Worker EGLGetBlobFuncANDROID get)
2741*61046927SAndroid Build Coastguard Worker {
2742*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2743*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_NONE, NULL);
2744*61046927SAndroid Build Coastguard Worker
2745*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, /* void */);
2746*61046927SAndroid Build Coastguard Worker
2747*61046927SAndroid Build Coastguard Worker if (!set || !get)
2748*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, /* void */);
2749*61046927SAndroid Build Coastguard Worker
2750*61046927SAndroid Build Coastguard Worker if (disp->BlobCacheSet)
2751*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, /* void */);
2752*61046927SAndroid Build Coastguard Worker
2753*61046927SAndroid Build Coastguard Worker disp->BlobCacheSet = set;
2754*61046927SAndroid Build Coastguard Worker disp->BlobCacheGet = get;
2755*61046927SAndroid Build Coastguard Worker
2756*61046927SAndroid Build Coastguard Worker disp->Driver->SetBlobCacheFuncsANDROID(disp, set, get);
2757*61046927SAndroid Build Coastguard Worker
2758*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, /* void */);
2759*61046927SAndroid Build Coastguard Worker }
2760*61046927SAndroid Build Coastguard Worker
2761*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglQueryDeviceAttribEXT(EGLDeviceEXT device,EGLint attribute,EGLAttrib * value)2762*61046927SAndroid Build Coastguard Worker eglQueryDeviceAttribEXT(EGLDeviceEXT device, EGLint attribute, EGLAttrib *value)
2763*61046927SAndroid Build Coastguard Worker {
2764*61046927SAndroid Build Coastguard Worker _EGLDevice *dev = _eglLookupDevice(device);
2765*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
2766*61046927SAndroid Build Coastguard Worker
2767*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2768*61046927SAndroid Build Coastguard Worker if (!dev)
2769*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(NULL, EGL_BAD_DEVICE_EXT, EGL_FALSE);
2770*61046927SAndroid Build Coastguard Worker
2771*61046927SAndroid Build Coastguard Worker ret = _eglQueryDeviceAttribEXT(dev, attribute, value);
2772*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(NULL, ret);
2773*61046927SAndroid Build Coastguard Worker }
2774*61046927SAndroid Build Coastguard Worker
2775*61046927SAndroid Build Coastguard Worker static const char *EGLAPIENTRY
eglQueryDeviceStringEXT(EGLDeviceEXT device,EGLint name)2776*61046927SAndroid Build Coastguard Worker eglQueryDeviceStringEXT(EGLDeviceEXT device, EGLint name)
2777*61046927SAndroid Build Coastguard Worker {
2778*61046927SAndroid Build Coastguard Worker _EGLDevice *dev = _eglLookupDevice(device);
2779*61046927SAndroid Build Coastguard Worker
2780*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2781*61046927SAndroid Build Coastguard Worker if (!dev)
2782*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(NULL, EGL_BAD_DEVICE_EXT, NULL);
2783*61046927SAndroid Build Coastguard Worker
2784*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(NULL, _eglQueryDeviceStringEXT(dev, name));
2785*61046927SAndroid Build Coastguard Worker }
2786*61046927SAndroid Build Coastguard Worker
2787*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglQueryDevicesEXT(EGLint max_devices,EGLDeviceEXT * devices,EGLint * num_devices)2788*61046927SAndroid Build Coastguard Worker eglQueryDevicesEXT(EGLint max_devices, EGLDeviceEXT *devices,
2789*61046927SAndroid Build Coastguard Worker EGLint *num_devices)
2790*61046927SAndroid Build Coastguard Worker {
2791*61046927SAndroid Build Coastguard Worker EGLBoolean ret;
2792*61046927SAndroid Build Coastguard Worker
2793*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2794*61046927SAndroid Build Coastguard Worker ret = _eglQueryDevicesEXT(max_devices, (_EGLDevice **)devices, num_devices);
2795*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(NULL, ret);
2796*61046927SAndroid Build Coastguard Worker }
2797*61046927SAndroid Build Coastguard Worker
2798*61046927SAndroid Build Coastguard Worker static EGLBoolean EGLAPIENTRY
eglQueryDisplayAttribEXT(EGLDisplay dpy,EGLint attribute,EGLAttrib * value)2799*61046927SAndroid Build Coastguard Worker eglQueryDisplayAttribEXT(EGLDisplay dpy, EGLint attribute, EGLAttrib *value)
2800*61046927SAndroid Build Coastguard Worker {
2801*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2802*61046927SAndroid Build Coastguard Worker
2803*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2804*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, EGL_FALSE);
2805*61046927SAndroid Build Coastguard Worker
2806*61046927SAndroid Build Coastguard Worker switch (attribute) {
2807*61046927SAndroid Build Coastguard Worker case EGL_DEVICE_EXT:
2808*61046927SAndroid Build Coastguard Worker *value = (EGLAttrib)disp->Device;
2809*61046927SAndroid Build Coastguard Worker break;
2810*61046927SAndroid Build Coastguard Worker default:
2811*61046927SAndroid Build Coastguard Worker RETURN_EGL_ERROR(disp, EGL_BAD_ATTRIBUTE, EGL_FALSE);
2812*61046927SAndroid Build Coastguard Worker }
2813*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(disp, EGL_TRUE);
2814*61046927SAndroid Build Coastguard Worker }
2815*61046927SAndroid Build Coastguard Worker
2816*61046927SAndroid Build Coastguard Worker static char *EGLAPIENTRY
eglGetDisplayDriverConfig(EGLDisplay dpy)2817*61046927SAndroid Build Coastguard Worker eglGetDisplayDriverConfig(EGLDisplay dpy)
2818*61046927SAndroid Build Coastguard Worker {
2819*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2820*61046927SAndroid Build Coastguard Worker char *ret;
2821*61046927SAndroid Build Coastguard Worker
2822*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_NONE, NULL);
2823*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, NULL);
2824*61046927SAndroid Build Coastguard Worker
2825*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.MESA_query_driver);
2826*61046927SAndroid Build Coastguard Worker
2827*61046927SAndroid Build Coastguard Worker ret = disp->Driver->QueryDriverConfig(disp);
2828*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2829*61046927SAndroid Build Coastguard Worker }
2830*61046927SAndroid Build Coastguard Worker
2831*61046927SAndroid Build Coastguard Worker static const char *EGLAPIENTRY
eglGetDisplayDriverName(EGLDisplay dpy)2832*61046927SAndroid Build Coastguard Worker eglGetDisplayDriverName(EGLDisplay dpy)
2833*61046927SAndroid Build Coastguard Worker {
2834*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp = _eglLockDisplay(dpy);
2835*61046927SAndroid Build Coastguard Worker const char *ret;
2836*61046927SAndroid Build Coastguard Worker
2837*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(disp, EGL_NONE, NULL);
2838*61046927SAndroid Build Coastguard Worker _EGL_CHECK_DISPLAY(disp, NULL);
2839*61046927SAndroid Build Coastguard Worker
2840*61046927SAndroid Build Coastguard Worker assert(disp->Extensions.MESA_query_driver);
2841*61046927SAndroid Build Coastguard Worker
2842*61046927SAndroid Build Coastguard Worker ret = disp->Driver->QueryDriverName(disp);
2843*61046927SAndroid Build Coastguard Worker RETURN_EGL_EVAL(disp, ret);
2844*61046927SAndroid Build Coastguard Worker }
2845*61046927SAndroid Build Coastguard Worker
2846*61046927SAndroid Build Coastguard Worker PUBLIC __eglMustCastToProperFunctionPointerType EGLAPIENTRY
eglGetProcAddress(const char * procname)2847*61046927SAndroid Build Coastguard Worker eglGetProcAddress(const char *procname)
2848*61046927SAndroid Build Coastguard Worker {
2849*61046927SAndroid Build Coastguard Worker static const struct _egl_entrypoint egl_functions[] = {
2850*61046927SAndroid Build Coastguard Worker #define EGL_ENTRYPOINT(f) {.name = #f, .function = (_EGLProc)f},
2851*61046927SAndroid Build Coastguard Worker #define EGL_ENTRYPOINT2(n, f) {.name = #n, .function = (_EGLProc)f},
2852*61046927SAndroid Build Coastguard Worker #include "eglentrypoint.h"
2853*61046927SAndroid Build Coastguard Worker #undef EGL_ENTRYPOINT2
2854*61046927SAndroid Build Coastguard Worker #undef EGL_ENTRYPOINT
2855*61046927SAndroid Build Coastguard Worker };
2856*61046927SAndroid Build Coastguard Worker _EGLProc ret = NULL;
2857*61046927SAndroid Build Coastguard Worker
2858*61046927SAndroid Build Coastguard Worker if (!procname)
2859*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, NULL);
2860*61046927SAndroid Build Coastguard Worker
2861*61046927SAndroid Build Coastguard Worker _EGL_FUNC_START(NULL, EGL_NONE, NULL);
2862*61046927SAndroid Build Coastguard Worker
2863*61046927SAndroid Build Coastguard Worker if (strncmp(procname, "egl", 3) == 0) {
2864*61046927SAndroid Build Coastguard Worker const struct _egl_entrypoint *entrypoint =
2865*61046927SAndroid Build Coastguard Worker bsearch(procname, egl_functions, ARRAY_SIZE(egl_functions),
2866*61046927SAndroid Build Coastguard Worker sizeof(egl_functions[0]), _eglFunctionCompare);
2867*61046927SAndroid Build Coastguard Worker if (entrypoint)
2868*61046927SAndroid Build Coastguard Worker ret = entrypoint->function;
2869*61046927SAndroid Build Coastguard Worker }
2870*61046927SAndroid Build Coastguard Worker
2871*61046927SAndroid Build Coastguard Worker if (!ret)
2872*61046927SAndroid Build Coastguard Worker ret = _glapi_get_proc_address(procname);
2873*61046927SAndroid Build Coastguard Worker
2874*61046927SAndroid Build Coastguard Worker RETURN_EGL_SUCCESS(NULL, ret);
2875*61046927SAndroid Build Coastguard Worker }
2876*61046927SAndroid Build Coastguard Worker
2877*61046927SAndroid Build Coastguard Worker static int
_eglLockDisplayInterop(EGLDisplay dpy,EGLContext context,_EGLDisplay ** disp,_EGLContext ** ctx)2878*61046927SAndroid Build Coastguard Worker _eglLockDisplayInterop(EGLDisplay dpy, EGLContext context, _EGLDisplay **disp,
2879*61046927SAndroid Build Coastguard Worker _EGLContext **ctx)
2880*61046927SAndroid Build Coastguard Worker {
2881*61046927SAndroid Build Coastguard Worker
2882*61046927SAndroid Build Coastguard Worker *disp = _eglLockDisplay(dpy);
2883*61046927SAndroid Build Coastguard Worker if (!*disp || !(*disp)->Initialized || !(*disp)->Driver) {
2884*61046927SAndroid Build Coastguard Worker if (*disp)
2885*61046927SAndroid Build Coastguard Worker _eglUnlockDisplay(*disp);
2886*61046927SAndroid Build Coastguard Worker return MESA_GLINTEROP_INVALID_DISPLAY;
2887*61046927SAndroid Build Coastguard Worker }
2888*61046927SAndroid Build Coastguard Worker
2889*61046927SAndroid Build Coastguard Worker *ctx = _eglLookupContext(context, *disp);
2890*61046927SAndroid Build Coastguard Worker if (!*ctx) {
2891*61046927SAndroid Build Coastguard Worker _eglUnlockDisplay(*disp);
2892*61046927SAndroid Build Coastguard Worker return MESA_GLINTEROP_INVALID_CONTEXT;
2893*61046927SAndroid Build Coastguard Worker }
2894*61046927SAndroid Build Coastguard Worker
2895*61046927SAndroid Build Coastguard Worker return MESA_GLINTEROP_SUCCESS;
2896*61046927SAndroid Build Coastguard Worker }
2897*61046927SAndroid Build Coastguard Worker
2898*61046927SAndroid Build Coastguard Worker PUBLIC int
MesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy,EGLContext context,struct mesa_glinterop_device_info * out)2899*61046927SAndroid Build Coastguard Worker MesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context,
2900*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_device_info *out)
2901*61046927SAndroid Build Coastguard Worker {
2902*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp;
2903*61046927SAndroid Build Coastguard Worker _EGLContext *ctx;
2904*61046927SAndroid Build Coastguard Worker int ret;
2905*61046927SAndroid Build Coastguard Worker
2906*61046927SAndroid Build Coastguard Worker ret = _eglLockDisplayInterop(dpy, context, &disp, &ctx);
2907*61046927SAndroid Build Coastguard Worker if (ret != MESA_GLINTEROP_SUCCESS)
2908*61046927SAndroid Build Coastguard Worker return ret;
2909*61046927SAndroid Build Coastguard Worker
2910*61046927SAndroid Build Coastguard Worker if (disp->Driver->GLInteropQueryDeviceInfo)
2911*61046927SAndroid Build Coastguard Worker ret = disp->Driver->GLInteropQueryDeviceInfo(disp, ctx, out);
2912*61046927SAndroid Build Coastguard Worker else
2913*61046927SAndroid Build Coastguard Worker ret = MESA_GLINTEROP_UNSUPPORTED;
2914*61046927SAndroid Build Coastguard Worker
2915*61046927SAndroid Build Coastguard Worker _eglUnlockDisplay(disp);
2916*61046927SAndroid Build Coastguard Worker return ret;
2917*61046927SAndroid Build Coastguard Worker }
2918*61046927SAndroid Build Coastguard Worker
2919*61046927SAndroid Build Coastguard Worker PUBLIC int
MesaGLInteropEGLExportObject(EGLDisplay dpy,EGLContext context,struct mesa_glinterop_export_in * in,struct mesa_glinterop_export_out * out)2920*61046927SAndroid Build Coastguard Worker MesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
2921*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_export_in *in,
2922*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_export_out *out)
2923*61046927SAndroid Build Coastguard Worker {
2924*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp;
2925*61046927SAndroid Build Coastguard Worker _EGLContext *ctx;
2926*61046927SAndroid Build Coastguard Worker int ret;
2927*61046927SAndroid Build Coastguard Worker
2928*61046927SAndroid Build Coastguard Worker ret = _eglLockDisplayInterop(dpy, context, &disp, &ctx);
2929*61046927SAndroid Build Coastguard Worker if (ret != MESA_GLINTEROP_SUCCESS)
2930*61046927SAndroid Build Coastguard Worker return ret;
2931*61046927SAndroid Build Coastguard Worker
2932*61046927SAndroid Build Coastguard Worker if (disp->Driver->GLInteropExportObject)
2933*61046927SAndroid Build Coastguard Worker ret = disp->Driver->GLInteropExportObject(disp, ctx, in, out);
2934*61046927SAndroid Build Coastguard Worker else
2935*61046927SAndroid Build Coastguard Worker ret = MESA_GLINTEROP_UNSUPPORTED;
2936*61046927SAndroid Build Coastguard Worker
2937*61046927SAndroid Build Coastguard Worker _eglUnlockDisplay(disp);
2938*61046927SAndroid Build Coastguard Worker return ret;
2939*61046927SAndroid Build Coastguard Worker }
2940*61046927SAndroid Build Coastguard Worker
2941*61046927SAndroid Build Coastguard Worker PUBLIC int
MesaGLInteropEGLFlushObjects(EGLDisplay dpy,EGLContext context,unsigned count,struct mesa_glinterop_export_in * objects,struct mesa_glinterop_flush_out * out)2942*61046927SAndroid Build Coastguard Worker MesaGLInteropEGLFlushObjects(EGLDisplay dpy, EGLContext context, unsigned count,
2943*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_export_in *objects,
2944*61046927SAndroid Build Coastguard Worker struct mesa_glinterop_flush_out *out)
2945*61046927SAndroid Build Coastguard Worker {
2946*61046927SAndroid Build Coastguard Worker _EGLDisplay *disp;
2947*61046927SAndroid Build Coastguard Worker _EGLContext *ctx;
2948*61046927SAndroid Build Coastguard Worker int ret;
2949*61046927SAndroid Build Coastguard Worker
2950*61046927SAndroid Build Coastguard Worker ret = _eglLockDisplayInterop(dpy, context, &disp, &ctx);
2951*61046927SAndroid Build Coastguard Worker if (ret != MESA_GLINTEROP_SUCCESS)
2952*61046927SAndroid Build Coastguard Worker return ret;
2953*61046927SAndroid Build Coastguard Worker
2954*61046927SAndroid Build Coastguard Worker if (disp->Driver->GLInteropFlushObjects)
2955*61046927SAndroid Build Coastguard Worker ret = disp->Driver->GLInteropFlushObjects(disp, ctx, count, objects, out);
2956*61046927SAndroid Build Coastguard Worker else
2957*61046927SAndroid Build Coastguard Worker ret = MESA_GLINTEROP_UNSUPPORTED;
2958*61046927SAndroid Build Coastguard Worker
2959*61046927SAndroid Build Coastguard Worker _eglUnlockDisplay(disp);
2960*61046927SAndroid Build Coastguard Worker return ret;
2961*61046927SAndroid Build Coastguard Worker }
2962