eglapi.c revision 0a606a400fe382a9bc726beef269b47f4485d85f
1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/**************************************************************************
2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2008 VMware, Inc.
4f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com>
5f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2010-2011 LunarG, Inc.
6f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * All Rights Reserved.
7f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
8f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
9f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * copy of this software and associated documentation files (the
10f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * "Software"), to deal in the Software without restriction, including
11f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * without limitation the rights to use, copy, modify, merge, publish,
12f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * distribute, sub license, and/or sell copies of the Software, and to
13f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * permit persons to whom the Software is furnished to do so, subject to
14f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * the following conditions:
15f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
16f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * The above copyright notice and this permission notice (including the
17f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * next paragraph) shall be included in all copies or substantial portions
18f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * of the Software.
19f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
20f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
23f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * DEALINGS IN THE SOFTWARE.
27f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
28f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu **************************************************************************/
29f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
30f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu
31adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
32adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Public EGL API entrypoints
33adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
34adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Generally, we use the EGLDisplay parameter as a key to lookup the
35adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * appropriate device driver handle, then jump though the driver's
36adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * dispatch table to handle the function.
37adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
38adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * That allows us the option of supporting multiple, simultaneous,
39adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * heterogeneous hardware devices in the future.
40adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
41adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * The EGLDisplay, EGLConfig, EGLContext and EGLSurface types are
42aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * opaque handles. Internal objects are linked to a display to
43aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * create the handles.
44adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
45aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * For each public API entry point, the opaque handles are looked up
46aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * before being dispatched to the drivers.  When it fails to look up
47aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * a handle, one of
48aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
49aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_DISPLAY
50aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_CONFIG
51aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_CONTEXT
52aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_SURFACE
53aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_SCREEN_MESA
54aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_MODE_MESA
55aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
56aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * is generated and the driver function is not called. An
57aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * uninitialized EGLDisplay has no driver associated with it. When
58aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * such display is detected,
59aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
60aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_NOT_INITIALIZED
61aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
62aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * is generated.
63adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
64bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * Some of the entry points use current display, context, or surface
65bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * implicitly.  For such entry points, the implicit objects are also
66bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * checked before calling the driver function.  Other than the
67bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * errors listed above,
68bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
69bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * EGL_BAD_CURRENT_SURFACE
70bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
71bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * may also be generated.
72bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
73adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Notes on naming conventions:
74adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
75adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * eglFooBar    - public EGL function
76adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_FOO_BAR  - public EGL token
77adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGLDatatype  - public EGL datatype
78adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
79adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _eglFooBar   - private EGL function
80adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _EGLDatatype - private EGL datatype, typedef'd struct
81adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _egl_struct  - private EGL struct, non-typedef'd
82adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
83adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
84adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
85adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
86adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <stdio.h>
87b2006a40eb22899d38cd31691640555228e36975Brian Paul#include <stdlib.h>
88adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <string.h>
897bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikov#include "c99_compat.h"
90efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov#include "c11/threads.h"
91b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák#include "GL/mesa_glinterop.h"
92efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov#include "eglcompiler.h"
931e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu
943c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace#include "eglglobals.h"
95adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h"
96adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h"
97adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
9894cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
99adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
100adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
1012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
102a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h"
1034eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#include "eglsync.h"
104adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
105adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
106adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
107f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint.
108655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu *
109655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * These macros will unlock the display and record the error code.
110f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
111bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_ERROR(disp, err, ret)        \
112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                         \
113655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      if (disp)                                 \
114655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu         _eglUnlockDisplay(disp);               \
115f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      /* EGL error codes are non-zero */        \
116f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      if (err)                                  \
117d780012cd75c24394b043b107d17eb8199ae2dc7Emil Velikov         _eglError(err, __func__);              \
118bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      return ret;                               \
119bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
120bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
121bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_SUCCESS(disp, ret) \
122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, EGL_SUCCESS, ret)
123bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
124b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu/* record EGL_SUCCESS only when ret evaluates to true */
125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_EVAL(disp, ret) \
126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, (ret) ? EGL_SUCCESS : 0, ret)
127f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
128f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
129bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu/*
130f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking.
131f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
132bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
133bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret, drv)         \
134bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                            \
135d780012cd75c24394b043b107d17eb8199ae2dc7Emil Velikov      drv = _eglCheckDisplay(disp, __func__);      \
136bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                    \
137bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);           \
138bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
139bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
140bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret, drv)      \
141bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                                   \
142d780012cd75c24394b043b107d17eb8199ae2dc7Emil Velikov      drv = _eglCheck ## type(disp, obj, __func__);       \
143bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                           \
144bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);                  \
145bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
146bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
147bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SURFACE(disp, surf, ret, drv) \
148bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Surface, surf, ret, drv)
149bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
150bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONTEXT(disp, context, ret, drv) \
151bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Context, context, ret, drv)
152bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
153bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONFIG(disp, conf, ret, drv) \
154bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Config, conf, ret, drv)
155bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
1564eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#define _EGL_CHECK_SYNC(disp, s, ret, drv) \
1574eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_OBJECT(disp, Sync, s, ret, drv)
158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
1607bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver *
161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp) {
164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp->Initialized) {
168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return disp->Driver;
172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
1757bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver *
176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
177f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
178f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
179f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
180f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
181f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!surf) {
182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
183f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
184f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
185f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
186f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
187f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
188f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
1897bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver *
190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
191f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
192f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
193f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
194f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
195f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!context) {
196f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
197f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
198f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
199f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
200f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
201f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
202f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
2037bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver *
204f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
205f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
206f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
207f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
208f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
209f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!conf) {
210f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
211f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
212f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
213f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
214f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
215f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
216f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
2177bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver *
2184eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu_eglCheckSync(_EGLDisplay *disp, _EGLSync *s, const char *msg)
2194eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
2204eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!drv)
2224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2234eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!s) {
2244eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      _eglError(EGL_BAD_PARAMETER, msg);
2254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   }
2274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   return drv;
2284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
2294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
231f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
232655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display.
233655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
2347bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDisplay *
235655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display)
236655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
237655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *dpy = _eglLookupDisplay(display);
238655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (dpy)
239efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov      mtx_lock(&dpy->Mutex);
240655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   return dpy;
241655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
242655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
243655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
244655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
245655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display.
246655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
2477bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline void
248655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy)
249655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
250efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov   mtx_unlock(&dpy->Mutex);
251655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
252655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
2536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brennemanstatic EGLBoolean
2546a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman_eglSetFuncName(const char *funcName, _EGLDisplay *disp, EGLenum objectType, _EGLResource *object)
2556a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman{
2566a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGLThreadInfo *thr = _eglGetCurrentThread();
2576a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   if (!_eglIsCurrentThreadDummy()) {
2586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      thr->CurrentFuncName = funcName;
2596a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      thr->CurrentObjectLabel = NULL;
2606a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2616a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      if (objectType == EGL_OBJECT_THREAD_KHR)
2626a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman         thr->CurrentObjectLabel = thr->Label;
2636a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      else if (objectType == EGL_OBJECT_DISPLAY_KHR && disp)
2646a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman         thr->CurrentObjectLabel = disp->Label;
2656a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      else if (object)
2666a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman         thr->CurrentObjectLabel = object->Label;
2676a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2686a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      return EGL_TRUE;
2696a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   }
2706a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2716a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _eglDebugReportFull(EGL_BAD_ALLOC, funcName, funcName,
2726a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman		       EGL_DEBUG_MSG_CRITICAL_KHR, NULL, NULL);
2736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   return EGL_FALSE;
2746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman}
2756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2766a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman#define _EGL_FUNC_START(disp, objectType, object, ret) \
2776a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   do { \
2786a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      if (!_eglSetFuncName(__func__, disp, objectType, (_EGLResource *) object)) { \
2796a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman         if (disp)                                 \
2806a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman            _eglUnlockDisplay(disp);               \
2816a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman         return ret; \
2826a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      } \
2836a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   } while(0)
284655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
2853e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace/**
2863e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace * Convert an attribute list from EGLint[] to EGLAttrib[].
2873e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace *
2883e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace * Return an EGL error code. The output parameter out_attrib_list is modified
2893e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace * only on success.
2903e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace */
2913e0d575a6d727c4334b783c443a5e1980dca43b4Chad VersaceEGLint
2923e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace_eglConvertIntsToAttribs(const EGLint *int_list, EGLAttrib **out_attrib_list)
2933e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace{
2943e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   size_t len = 0;
2953e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   EGLAttrib *attrib_list;
2963e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
2973e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   if (int_list) {
2983e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace      while (int_list[2*len] != EGL_NONE)
2993e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace         ++len;
3003e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   }
3013e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
3023e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   if (len == 0) {
3033e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace      *out_attrib_list = NULL;
3043e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace      return EGL_SUCCESS;
3053e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   }
3063e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
3073e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   if (2*len + 1 > SIZE_MAX / sizeof(EGLAttrib))
3083e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace      return EGL_BAD_ALLOC;
3093e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
3103e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   attrib_list = malloc((2*len + 1) * sizeof(EGLAttrib));
3113e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   if (!attrib_list)
3123e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace      return EGL_BAD_ALLOC;
3133e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
3143e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   for (size_t i = 0; i < len; ++i) {
3153e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace      attrib_list[2*i + 0] = int_list[2*i + 0];
3163e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace      attrib_list[2*i + 1] = int_list[2*i + 1];
3173e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   }
3183e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
3193e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   attrib_list[2*len] = EGL_NONE;
3203e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
3213e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   *out_attrib_list = attrib_list;
3223e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace   return EGL_SUCCESS;
3233e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace}
3243e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
3253e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace
326515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšákstatic EGLint *
327515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák_eglConvertAttribsToInt(const EGLAttrib *attr_list)
328515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák{
329515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   EGLint *int_attribs = NULL;
330515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
331515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   /* Convert attributes from EGLAttrib[] to EGLint[] */
332515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   if (attr_list) {
333515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák      int i, size = 0;
334515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
335515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák      while (attr_list[size] != EGL_NONE)
336515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák         size += 2;
337515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
338515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák      size += 1; /* add space for EGL_NONE */
339515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
340515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák      int_attribs = calloc(size, sizeof(int_attribs[0]));
341515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák      if (!int_attribs)
342515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák         return NULL;
343515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
344515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák      for (i = 0; i < size; i++)
345515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák         int_attribs[i] = attr_list[i];
346515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   }
347515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   return int_attribs;
348515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák}
349515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
350515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
351655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
3526052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
353db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display.
354adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
3551ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
3564aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3586d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   _EGLPlatformType plat;
3596d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   _EGLDisplay *dpy;
3606d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   void *native_display_ptr;
3616d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace
3626a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY);
3636a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
3646d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   STATIC_ASSERT(sizeof(void*) == sizeof(nativeDisplay));
3656d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   native_display_ptr = (void*) nativeDisplay;
3666d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace
3676d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   plat = _eglGetNativePlatform(native_display_ptr);
3686d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   dpy = _eglFindDisplay(plat, native_display_ptr);
369721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
370adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
371adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
372017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brennemanstatic EGLDisplay
373017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman_eglGetPlatformDisplayCommon(EGLenum platform, void *native_display,
374017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman			     const EGLint *attrib_list)
375468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
376468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   _EGLDisplay *dpy;
377468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
378468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   switch (platform) {
379468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_X11_PLATFORM
380468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   case EGL_PLATFORM_X11_EXT:
381468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      dpy = _eglGetX11Display((Display*) native_display, attrib_list);
382468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      break;
383468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif
384468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_DRM_PLATFORM
385468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   case EGL_PLATFORM_GBM_MESA:
386468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      dpy = _eglGetGbmDisplay((struct gbm_device*) native_display,
387468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                              attrib_list);
388468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      break;
389468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif
390468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_WAYLAND_PLATFORM
391468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   case EGL_PLATFORM_WAYLAND_EXT:
392468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      dpy = _eglGetWaylandDisplay((struct wl_display*) native_display,
393468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                  attrib_list);
394468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      break;
395468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif
396468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   default:
397468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL);
398468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   }
399468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
400468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglGetDisplayHandle(dpy);
401468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
402adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
403017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brennemanstatic EGLDisplay EGLAPIENTRY
404017946b7247ea7c36219b44dfc118ccad4da7d1dKyle BrennemaneglGetPlatformDisplayEXT(EGLenum platform, void *native_display,
405017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman                         const EGLint *attrib_list)
406017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman{
4076a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY);
408017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman   return _eglGetPlatformDisplayCommon(platform, native_display, attrib_list);
409017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman}
410017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman
411820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLDisplay EGLAPIENTRY
412820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglGetPlatformDisplay(EGLenum platform, void *native_display,
413820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                      const EGLAttrib *attrib_list)
414820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{
415820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   EGLDisplay display;
416017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman   EGLint *int_attribs;
417820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
4186a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY);
4196a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
420017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman   int_attribs = _eglConvertAttribsToInt(attrib_list);
421820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   if (attrib_list && !int_attribs)
422820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, NULL);
423820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
424017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman   display = _eglGetPlatformDisplayCommon(platform, native_display, int_attribs);
425820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   free(int_attribs);
426820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   return display;
427820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák}
428820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
4296052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
430dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * Copy the extension into the string and update the string pointer.
431dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner */
432dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic EGLint
433dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglAppendExtension(char **str, const char *ext)
434dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{
435dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   char *s = *str;
436dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   size_t len = strlen(ext);
437dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
438dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   if (s) {
439dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      memcpy(s, ext, len);
440dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      s[len++] = ' ';
441dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      s[len] = '\0';
442dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
443dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      *str += len;
444dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   }
445dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   else {
446dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      len++;
447dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   }
448dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
449dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   return (EGLint) len;
450dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner}
451dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
452dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner/**
453dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * Examine the individual extension enable/disable flags and recompute
454dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * the driver's Extensions string.
455dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner */
456dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic void
457dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglCreateExtensionsString(_EGLDisplay *dpy)
458dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{
459dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner#define _EGL_CHECK_EXTENSION(ext)                                          \
460dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   do {                                                                    \
461dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      if (dpy->Extensions.ext) {                                           \
462dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner         _eglAppendExtension(&exts, "EGL_" #ext);                          \
463dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner         assert(exts <= dpy->ExtensionsString + _EGL_MAX_EXTENSIONS_LEN);  \
464dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      }                                                                    \
465dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   } while (0)
466dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
467dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   char *exts = dpy->ExtensionsString;
468dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
46932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   /* Please keep these sorted alphabetically. */
4708975527f58afd4af77966c6e46b485fc04008779Rob Herring   _EGL_CHECK_EXTENSION(ANDROID_framebuffer_target);
47132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(ANDROID_image_native_buffer);
472e21e81aa1885287e438970429d44abb8b3dabb96Rob Herring   _EGL_CHECK_EXTENSION(ANDROID_recordable);
473dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
47432aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(CHROMIUM_sync_control);
475dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
47632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(EXT_buffer_age);
47732aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(EXT_create_context_robustness);
47832aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import);
47932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage);
480dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
48132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_cl_event2);
48232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_create_context);
48332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_fence_sync);
484dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(KHR_get_all_proc_addresses);
48532aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_gl_colorspace);
48632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_gl_renderbuffer_image);
487dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(KHR_gl_texture_2D_image);
488dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(KHR_gl_texture_3D_image);
48932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_gl_texture_cubemap_image);
49032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   if (dpy->Extensions.KHR_image_base && dpy->Extensions.KHR_image_pixmap)
49132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák      _eglAppendExtension(&exts, "EGL_KHR_image");
49232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_image_base);
49332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_image_pixmap);
494d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson   _EGL_CHECK_EXTENSION(KHR_no_config_context);
495dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(KHR_reusable_sync);
49632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_surfaceless_context);
4970a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   if (dpy->Extensions.EXT_swap_buffers_with_damage)
4980a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom      _eglAppendExtension(&exts, "EGL_KHR_swap_buffers_with_damage");
499a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   _EGL_CHECK_EXTENSION(KHR_wait_sync);
500dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
501d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson   if (dpy->Extensions.KHR_no_config_context)
502d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson      _eglAppendExtension(&exts, "EGL_MESA_configless_context");
50332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(MESA_drm_image);
50432aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(MESA_image_dma_buf_export);
505dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
506dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(NOK_swap_region);
507dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(NOK_texture_from_pixmap);
508dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
509dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(NV_post_sub_buffer);
5108f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
51132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(WL_bind_wayland_display);
51232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image);
51332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák
514dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner#undef _EGL_CHECK_EXTENSION
515dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner}
516dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
517dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic void
518dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglCreateAPIsString(_EGLDisplay *dpy)
519dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{
520dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   if (dpy->ClientAPIs & EGL_OPENGL_BIT)
521dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      strcat(dpy->ClientAPIsString, "OpenGL ");
522dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
52321edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova   if (dpy->ClientAPIs & EGL_OPENGL_ES_BIT ||
52421edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova       dpy->ClientAPIs & EGL_OPENGL_ES2_BIT ||
52521edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova       dpy->ClientAPIs & EGL_OPENGL_ES3_BIT_KHR) {
526dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      strcat(dpy->ClientAPIsString, "OpenGL_ES ");
52721edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova   }
528dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
529dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   if (dpy->ClientAPIs & EGL_OPENVG_BIT)
530dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      strcat(dpy->ClientAPIsString, "OpenVG ");
531dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
532dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   assert(strlen(dpy->ClientAPIsString) < sizeof(dpy->ClientAPIsString));
533dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner}
534dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
535efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšákstatic void
536efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák_eglComputeVersion(_EGLDisplay *disp)
537efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák{
5380e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák   disp->Version = 14;
539a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák
540a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák   if (disp->Extensions.KHR_fence_sync &&
541a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_cl_event2 &&
542a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_wait_sync &&
543a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_image_base &&
544a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_texture_2D_image &&
545a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_texture_3D_image &&
546a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_texture_cubemap_image &&
547a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_renderbuffer_image &&
548a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_create_context &&
549a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.EXT_create_context_robustness &&
550a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_get_all_proc_addresses &&
551a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_colorspace &&
552a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_surfaceless_context)
553a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák      disp->Version = 15;
554efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák}
555dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
556dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner/**
5576052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
5586052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
5596052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
5601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
561adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
562adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
563655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5647e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
5656a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
5666a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
5672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
568bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
5692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
570a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
571f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      if (!_eglMatchDriver(disp, EGL_FALSE))
572f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
5732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
574310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
575a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      disp->ClientAPIs &= _EGL_API_ALL_BITS;
5767e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace
5777e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace      /* EGL_KHR_get_all_proc_addresses is a corner-case extension. The spec
5787e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * classifies it as an EGL display extension, though conceptually it's an
5797e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * EGL client extension.
5807e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *
5817e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * From the EGL_KHR_get_all_proc_addresses spec:
5827e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *
5837e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *    The EGL implementation must expose the name
5847e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *    EGL_KHR_client_get_all_proc_addresses if and only if it exposes
5857e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *    EGL_KHR_get_all_proc_addresses and supports
5867e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *    EGL_EXT_client_extensions.
5877e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *
5887e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * Mesa unconditionally exposes both client extensions mentioned above,
5897e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * so the spec requires that each EGLDisplay unconditionally expose
5907e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * EGL_KHR_get_all_proc_addresses also.
5917e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       */
5927e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace      disp->Extensions.KHR_get_all_proc_addresses = EGL_TRUE;
593dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
594efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák      _eglComputeVersion(disp);
595dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      _eglCreateExtensionsString(disp);
596dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      _eglCreateAPIsString(disp);
5973593f37fd7b599e217bd1f894ac671a14a058b8dEmil Velikov      snprintf(disp->VersionString, sizeof(disp->VersionString),
5980e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák              "%d.%d (%s)", disp->Version / 10, disp->Version % 10,
599dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner              disp->Driver->Name);
600adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
6012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
6032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
6040e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák      *major = disp->Version / 10;
6050e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák      *minor = disp->Version % 10;
6062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
6072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
608bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
610adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
611adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
613adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
614adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
615655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
6162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6176a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
6186a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
6192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
620bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
6212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
622a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (disp->Initialized) {
623a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
624a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu
625ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
626a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      /* do not reset disp->Driver */
62737e3a116f8ae09d0fa894d126d081a1af24ec14fDave Airlie      disp->ClientAPIsString[0] = 0;
628a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_FALSE;
6292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
6302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
631bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
6322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
6332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6351ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
636adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
637adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6383c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace   _EGLDisplay *disp;
639aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
640aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
6413c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace   if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) {
6423c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace      RETURN_EGL_SUCCESS(NULL, _eglGlobal.ClientExtensionString);
6433c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace   }
6443c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace
6453c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace   disp = _eglLockDisplay(dpy);
6466a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, NULL);
647bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, NULL, drv);
648b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
6496c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   switch (name) {
6506c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   case EGL_VENDOR:
6516c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_SUCCESS(disp, _EGL_VENDOR_STRING);
6526c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   case EGL_VERSION:
6536c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_SUCCESS(disp, disp->VersionString);
6546c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   case EGL_EXTENSIONS:
6556c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_SUCCESS(disp, disp->ExtensionsString);
6566c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   case EGL_CLIENT_APIS:
6576c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_SUCCESS(disp, disp->ClientAPIsString);
6586c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   default:
6596c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL);
6606c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   }
661adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
662adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
663adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
6662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
667adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
668655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
669aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
670b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
671aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
6726a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
6736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
674bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
675b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
676b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
677bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
678adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
679adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
680adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6811ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
6832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
684adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
685655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
686aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
687b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
688aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
6896a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
6906a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
691bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
692b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs,
6932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
694b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
695bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
696adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
697adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
698adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6991ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
7012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
702adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
703655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
7042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
7052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
706b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7086a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
7096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
710bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv);
711b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
712b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
713bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
714adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
715adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
716adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7171ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
7182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
7192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
7202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
721655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
7222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
7232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
7242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
726b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
7272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7286a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_CONTEXT);
7296a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
7306b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
7316b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
732d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson   if (!config && !disp->Extensions.KHR_no_config_context)
7334b17dff3e5128bef67ea79d20624e878c3b48729Neil Roberts      RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT);
734b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg
735b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!share && share_list != EGL_NO_CONTEXT)
736bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
7394ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT;
740b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
741bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
742adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
743adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
744adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7451ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
746adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
747adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
748655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
749aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
750aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
751b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
752aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
7536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
7546a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
755bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
7562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
757b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyContext(drv, disp, context);
758b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
759bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
762adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
7652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
766adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
767655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
7682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
7692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
7702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
7712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
772b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
7756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
77617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
777bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
77817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
77917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
78017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
78117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
78217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
78317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
784bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
78517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
7862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
787bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(disp, EGL_TRUE);
78817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
7892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
790bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
7916b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!draw_surf || !read_surf) {
7920ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor      /* From the EGL 1.4 (20130211) spec:
7930ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor       *
7940ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor       *    To release the current context without assigning a new one, set ctx
7950ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor       *    to EGL_NO_CONTEXT and set draw and read to EGL_NO_SURFACE.
7960ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor       */
7970ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor      if (!disp->Extensions.KHR_surfaceless_context && ctx != EGL_NO_CONTEXT)
7986b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
7996b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
8006b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if ((!draw_surf && draw != EGL_NO_SURFACE) ||
8016b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          (!read_surf && read != EGL_NO_SURFACE))
8026b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
8036b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (draw_surf || read_surf)
8046b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
8056b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   }
8062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
807b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
808b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
809bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
811adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
812adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
8142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
8152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
816adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
817655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
818aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
819aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
820b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
821aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
8226a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
8236a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
824bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
825b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryContext(drv, disp, context, attribute, value);
826b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
827bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
828adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
829adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
830adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
831468cc866b4b308cee40470f06b31002c6c56da96Chad Versacestatic EGLSurface
832468cc866b4b308cee40470f06b31002c6c56da96Chad Versace_eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
833468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                              void *native_window, const EGLint *attrib_list)
834adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
8362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
838b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
8392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
840bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
84191ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh
84291ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh   if (native_window == NULL)
84391ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
84491ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh
845468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window,
8466d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace                                       attrib_list);
8474ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
848b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
849bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
850adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
851adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
852adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8531ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
854468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
855468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                       EGLNativeWindowType window, const EGLint *attrib_list)
856adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
857655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
8586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
8596a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
860468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   STATIC_ASSERT(sizeof(void*) == sizeof(window));
861468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglCreateWindowSurfaceCommon(disp, config, (void*) window,
862468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                        attrib_list);
863468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
864468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
8657d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brennemanstatic void *
8667d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle BrennemanfixupNativeWindow(_EGLDisplay *disp, void *native_window)
867468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
868468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_X11_PLATFORM
869468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   if (disp->Platform == _EGL_PLATFORM_X11 && native_window != NULL) {
870468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      /* The `native_window` parameter for the X11 platform differs between
871468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * eglCreateWindowSurface() and eglCreatePlatformPixmapSurfaceEXT(). In
872468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * eglCreateWindowSurface(), the type of `native_window` is an Xlib
873468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * `Window`. In eglCreatePlatformWindowSurfaceEXT(), the type is
874468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * `Window*`.  Convert `Window*` to `Window` because that's what
875468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * dri2_x11_create_window_surface() expects.
876468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       */
8777d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman      return (void *)(* (Window*) native_window);
878468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   }
879468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif
8807d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   return native_window;
8817d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman}
8827d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman
8837d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brennemanstatic EGLSurface EGLAPIENTRY
8847d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle BrennemaneglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config,
8857d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman                                  void *native_window,
8867d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman                                  const EGLint *attrib_list)
8877d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman{
8887d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
8897d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman
8907d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   native_window = fixupNativeWindow(disp, native_window);
891468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
8926a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
893468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglCreateWindowSurfaceCommon(disp, config, native_window,
894468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                        attrib_list);
895468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
896468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
897468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
898820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLSurface EGLAPIENTRY
899820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config,
900820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                               void *native_window,
901820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                               const EGLAttrib *attrib_list)
902820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{
9037d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
904820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   EGLSurface surface;
9056a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   EGLint *int_attribs;
9066a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
9076a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
908820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
9096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   int_attribs = _eglConvertAttribsToInt(attrib_list);
910820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   if (attrib_list && !int_attribs)
9116a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
912820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
9137d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   native_window = fixupNativeWindow(disp, native_window);
9147d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   surface = _eglCreateWindowSurfaceCommon(disp, config, native_window,
9157d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman                                           int_attribs);
916820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   free(int_attribs);
917820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   return surface;
918820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák}
919820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
9208cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brennemanstatic void *
9218cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle BrennemanfixupNativePixmap(_EGLDisplay *disp, void *native_pixmap)
9228cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman{
9238cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman#ifdef HAVE_X11_PLATFORM
9248cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman      /* The `native_pixmap` parameter for the X11 platform differs between
9258cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * eglCreatePixmapSurface() and eglCreatePlatformPixmapSurfaceEXT(). In
9268cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * eglCreatePixmapSurface(), the type of `native_pixmap` is an Xlib
9278cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * `Pixmap`. In eglCreatePlatformPixmapSurfaceEXT(), the type is
9288cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * `Pixmap*`.  Convert `Pixmap*` to `Pixmap` because that's what
9298cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * dri2_x11_create_pixmap_surface() expects.
9308cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       */
9318cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   if (disp->Platform == _EGL_PLATFORM_X11 && native_pixmap != NULL)
9328cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman      return (void *)(* (Pixmap*) native_pixmap);
9338cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman#endif
9348cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   return native_pixmap;
9358cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman}
936820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
937468cc866b4b308cee40470f06b31002c6c56da96Chad Versacestatic EGLSurface
938468cc866b4b308cee40470f06b31002c6c56da96Chad Versace_eglCreatePixmapSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
939468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                              void *native_pixmap, const EGLint *attrib_list)
940468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
9412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
9422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
944b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
9452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
946bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
947468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap,
9486d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace                                       attrib_list);
9494ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
950b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
951bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
952adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
953adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
954adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9551ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
956468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
957468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
958468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
959468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   _EGLDisplay *disp = _eglLockDisplay(dpy);
9606a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
9616a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
962468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   STATIC_ASSERT(sizeof(void*) == sizeof(pixmap));
963468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglCreatePixmapSurfaceCommon(disp, config, (void*) pixmap,
964468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                         attrib_list);
965468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
966468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
967e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLSurface EGLAPIENTRY
968468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config,
969468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                   void *native_pixmap,
970468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                   const EGLint *attrib_list)
971468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
972468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   _EGLDisplay *disp = _eglLockDisplay(dpy);
973468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
9746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
9758cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   native_pixmap = fixupNativePixmap(disp, native_pixmap);
976468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap,
977468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                        attrib_list);
978468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
979468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
980468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
981468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceEGLSurface EGLAPIENTRY
982820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config,
983820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                               void *native_pixmap,
984820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                               const EGLAttrib *attrib_list)
985820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{
9868cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
987820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   EGLSurface surface;
9886a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   EGLint *int_attribs;
9896a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
9906a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
991820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
9926a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   int_attribs = _eglConvertAttribsToInt(attrib_list);
993820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   if (attrib_list && !int_attribs)
9946a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
995820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
9968cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   native_pixmap = fixupNativePixmap(disp, native_pixmap);
9978cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   surface = _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap,
9988cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman                                           int_attribs);
999820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   free(int_attribs);
1000820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   return surface;
1001820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák}
1002820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
1003820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
1004820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLSurface EGLAPIENTRY
10052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
10062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
1007adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1008655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
10102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1012b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
10132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
10146a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
1015bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
10162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
10172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
10184ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1019b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1020bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1021adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1022adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1023adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10241ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1025adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
1026adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1027655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1028aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1029aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1030b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1031aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
10326a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1033bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
10342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
1035b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroySurface(drv, disp, surf);
1036b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1037bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1038adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1039adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10401ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
10412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
10422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
1043adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1044655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1045aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1046aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1047b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1048aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
10496a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1050bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1051b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
1052b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1053bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1054adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1055adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10561ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
10572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
10582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
1059adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1060655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1061aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1062aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1063b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1064aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
10656a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1066bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1067b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
1068b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1069bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1070adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1071adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1072adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10731ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1074adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1075adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1076655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1077aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1078aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1079b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1080aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
10816a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1082bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1083b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.BindTexImage(drv, disp, surf, buffer);
1084b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1085bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1086adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1087adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1088adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10891ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1090adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1091adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1092655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1093aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1094aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1095b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1096aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
10976a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1098bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1099b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer);
1100b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1101bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1102adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1103adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1104adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11051ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1106adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
1107adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1108655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
110957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
11106a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGLSurface *surf = ctx ? ctx->DrawSurface : NULL;
1111aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1112b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1113aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
11146a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1115bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
111657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
1117d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1118d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       ctx->Resource.Display != disp)
1119bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
112057da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
1121d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE)
1122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
112357da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
1124b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapInterval(drv, disp, surf, interval);
1125b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1127adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1128adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1129adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11301ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
11312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
1132adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1133bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
1134655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1135aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1136aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1137b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1138aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
11396a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1140bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1141bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
1142bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
1143400b833592d9aad7b2c4627a897380642d52189fAlexander von Gluck IV   #ifndef _EGL_BUILT_IN_DRIVER_HAIKU
1144d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1145d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
1146bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
1147400b833592d9aad7b2c4627a897380642d52189fAlexander von Gluck IV   #endif
1148b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1149b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapBuffers(drv, disp, surf);
1150bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
1151bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1152adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1153adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1154adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11550a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean
11560a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageCommon(_EGLDisplay *disp, _EGLSurface *surf,
11570a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom                               EGLint *rects, EGLint n_rects)
11586425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg{
11596425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   _EGLContext *ctx = _eglGetCurrentContext();
11606425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   _EGLDriver *drv;
11616425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   EGLBoolean ret;
11626425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
11636425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
11646425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
11656425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   /* surface must be bound to current context in EGL 1.4 */
11666425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
11676425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg       surf != ctx->DrawSurface)
11686425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
11696425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
11706425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   if ((n_rects > 0 && rects == NULL) || n_rects < 0)
11716425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
11726425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
11736425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   ret = drv->API.SwapBuffersWithDamageEXT(drv, disp, surf, rects, n_rects);
11746425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
11756425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   RETURN_EGL_EVAL(disp, ret);
11766425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg}
11776425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
11780a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean EGLAPIENTRY
11790a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageEXT(EGLDisplay dpy, EGLSurface surface,
11800a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom                            EGLint *rects, EGLint n_rects)
11810a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom{
11820a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGLDisplay *disp = _eglLockDisplay(dpy);
11830a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGLSurface *surf = _eglLookupSurface(surface, disp);
11840a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
11850a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   return eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects);
11860a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom}
11870a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom
11880a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean EGLAPIENTRY
11890a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface,
11900a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom                            EGLint *rects, EGLint n_rects)
11910a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom{
11920a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGLDisplay *disp = _eglLockDisplay(dpy);
11930a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGLSurface *surf = _eglLookupSurface(surface, disp);
11940a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
11950a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   return eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects);
11960a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom}
11970a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom
11981ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
11994aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
1200adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1201655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1202aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1203aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1204b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
12056d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   void *native_pixmap_ptr;
12066d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace
12076a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
12086d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   STATIC_ASSERT(sizeof(void*) == sizeof(target));
12096d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   native_pixmap_ptr = (void*) target;
1210aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1211bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
121285fe9484945cb57ffd49df248b0e5057eba6af04Benjamin Franzke   if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay))
1213f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE);
12146d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   ret = drv->API.CopyBuffers(drv, disp, surf, native_pixmap_ptr);
1215b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1216bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1217adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1218adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1219adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
122082a2e2cb5024c37a1779594320f23f225a83c79dKyle Brennemanstatic EGLBoolean
122182a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman_eglWaitClientCommon(void)
1222adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
12236c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
12246c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
12252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1226b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
12272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
12286c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
1229bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
12302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1231ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
1232efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov   mtx_lock(&disp->Mutex);
1233655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
1234655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   /* let bad current context imply bad current surface */
1235d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1236d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
1237bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
1238b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1239b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
1240a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
12412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1242b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitClient(drv, disp, ctx);
12436c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
1244bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
12456c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
12466c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
124782a2e2cb5024c37a1779594320f23f225a83c79dKyle BrennemanEGLBoolean EGLAPIENTRY
124882a2e2cb5024c37a1779594320f23f225a83c79dKyle BrennemaneglWaitClient(void)
124982a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman{
12506a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext(), EGL_FALSE);
125182a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman   return _eglWaitClientCommon();
125282a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman}
12532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
12546c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
12556c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
12566c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
12576e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman   /* Since we only support OpenGL and GLES, eglWaitGL is equivalent to eglWaitClient. */
12586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext(), EGL_FALSE);
125982a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman   return _eglWaitClientCommon();
1260adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1261adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1262adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
12631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1264adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
1265adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
12666c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
12676c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
12682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1269b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
12702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
12716c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
1272bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1273b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
12746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE);
12756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1276655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   disp = ctx->Resource.Display;
1277efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov   mtx_lock(&disp->Mutex);
1278655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
12796c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
1280d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1281d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
1282bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
1283b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1284b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
1285a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
12862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1287b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitNative(drv, disp, engine);
12882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1289bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1290adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1291adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1292adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
12931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
1294adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
1295adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1296a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
1297b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLDisplay ret;
1298b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1299b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
1300b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1301bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1302adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1303adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1304adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
13051ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
1306adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
1307adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1308adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
1309b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
1310b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1311b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetContextHandle(ctx);
1312b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1313bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1314adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1315adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1316adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
13171ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
1318adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
1319adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
132061906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
1321b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLint err = EGL_SUCCESS;
132261906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
1323b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
132461906631202af855d0742586956ff9f34522a525Chia-I Wu
13256a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_NO_SURFACE);
13266a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
132761906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
1328bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
132961906631202af855d0742586956ff9f34522a525Chia-I Wu
133061906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
133161906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
133261906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
133361906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
133461906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
133561906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
133661906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
133761906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
133861906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
1339b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      err = EGL_BAD_PARAMETER;
134061906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
134161906631202af855d0742586956ff9f34522a525Chia-I Wu   }
134261906631202af855d0742586956ff9f34522a525Chia-I Wu
1343b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetSurfaceHandle(surf);
1344b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1345bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(NULL, err, ret);
1346adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1347adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1348adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
13491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
1350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
1351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
135248822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
135348822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
135475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
135575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
1356adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
1357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1358adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1359adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1360b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
1361b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
1362b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
1363b2006a40eb22899d38cd31691640555228e36975Brian Paul
1364d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1365d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
1366d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
1367d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
1368d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
1369d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
1370d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1371d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
1372d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
1373d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
1374d5078b94323241a6482f54797756116b1c864327Brian Paul */
1375c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1376b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
1377b2006a40eb22899d38cd31691640555228e36975Brian Paul{
13786a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGLThreadInfo *t;
1379b2006a40eb22899d38cd31691640555228e36975Brian Paul
13806a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE);
13816a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
13826a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   t = _eglGetCurrentThread();
138375da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
1384bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
138575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
138621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
1387bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
138821b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
13896e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman   t->CurrentAPI = api;
1390b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1391bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1392b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1393b2006a40eb22899d38cd31691640555228e36975Brian Paul
1394b2006a40eb22899d38cd31691640555228e36975Brian Paul
1395d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1396d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1397d5078b94323241a6482f54797756116b1c864327Brian Paul */
1398c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY
1399d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1400d5078b94323241a6482f54797756116b1c864327Brian Paul{
1401d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1402b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLenum ret;
1403b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1404b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
14056e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman   ret = t->CurrentAPI;
1406b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1407bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1408d5078b94323241a6482f54797756116b1c864327Brian Paul}
1409d5078b94323241a6482f54797756116b1c864327Brian Paul
1410d5078b94323241a6482f54797756116b1c864327Brian Paul
1411c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
1412b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1413b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1414b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1415b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1416655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
14172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
14182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
14192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1420b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
14212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
14226a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
14236a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1424bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
14252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
14262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
14272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
14284ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1429b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1430bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1431b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1432b2006a40eb22899d38cd31691640555228e36975Brian Paul
1433b2006a40eb22899d38cd31691640555228e36975Brian Paul
1434c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1435b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1436b2006a40eb22899d38cd31691640555228e36975Brian Paul{
143711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
14382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
143911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
14406e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      _EGLContext *ctx = t->CurrentContext;
14416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
14426a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE);
14436a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
14446e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      if (ctx) {
14456e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         _EGLDisplay *disp = ctx->Resource.Display;
14466e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         _EGLDriver *drv;
14476e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman
14486e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         mtx_lock(&disp->Mutex);
14496e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         drv = disp->Driver;
14506e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
14516e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         mtx_unlock(&disp->Mutex);
14526e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      }
1453b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
14542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
145575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1456b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1457bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1458b2006a40eb22899d38cd31691640555228e36975Brian Paul}
14597012d01d888d482f2c6ad1180231a482026d213aJon Smirl
14607012d01d888d482f2c6ad1180231a482026d213aJon Smirl
146158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brennemanstatic EGLImage
146258338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman_eglCreateImageCommon(_EGLDisplay *disp, EGLContext ctx, EGLenum target,
1463a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1464a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1465a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1466a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1467a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1468d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák   EGLImage ret;
1469a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1470bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
14716b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
14726b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1473b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
1474bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
14750de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen   /* "If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid display,
14760de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen    *  <ctx> must be EGL_NO_CONTEXT..."
14770de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen    */
14780de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen   if (ctx != EGL_NO_CONTEXT && target == EGL_LINUX_DMA_BUF_EXT)
14790de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1480a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1481a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1482a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
14834ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1484b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1485bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1486a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1487a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
148858338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brennemanstatic EGLImage EGLAPIENTRY
148958338c6b650d85a2484f50c0941cb3e2947fab8eKyle BrennemaneglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
149058338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman                  EGLClientBuffer buffer, const EGLint *attr_list)
149158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman{
149258338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
14936a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_IMAGE_KHR);
149458338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman   return _eglCreateImageCommon(disp, ctx, target, buffer, attr_list);
149558338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman}
149658338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman
1497a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1498515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek OlšákEGLImage EGLAPIENTRY
1499515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek OlšákeglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1500515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák               EGLClientBuffer buffer, const EGLAttrib *attr_list)
1501515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák{
150258338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
1503515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   EGLImage image;
15046a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   EGLint *int_attribs;
15056a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
15066a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_IMAGE_KHR);
1507515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
15086a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   int_attribs = _eglConvertAttribsToInt(attr_list);
1509515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   if (attr_list && !int_attribs)
151058338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman      RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_IMAGE);
1511515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
151258338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman   image = _eglCreateImageCommon(disp, ctx, target, buffer, int_attribs);
1513515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   free(int_attribs);
1514515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   return image;
1515515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák}
1516515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
1517515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
15182885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLBoolean EGLAPIENTRY
15192885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglDestroyImage(EGLDisplay dpy, EGLImage image)
1520a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1521655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1522a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1523a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1524b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1525a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
15266a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
15276a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1528bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
15296b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
15306b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
1531a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1532bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1533a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1534a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1535b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyImageKHR(drv, disp, img);
1536b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1537bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1538a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1539a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1540a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1541d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLSync
1542804488518296fbf20b06244bc0aa2e2793c61998Chad Versace_eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_list,
1543804488518296fbf20b06244bc0aa2e2793c61998Chad Versace               EGLBoolean orig_is_EGLAttrib,
154451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák               EGLenum invalid_type_error)
15454eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
15469a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   _EGLContext *ctx = _eglGetCurrentContext();
15474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
15484eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *sync;
1549d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák   EGLSync ret;
15504eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
15514eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
15529a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák
1553804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   if (!disp->Extensions.KHR_cl_event2 && orig_is_EGLAttrib) {
1554f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace      /* There exist two EGLAttrib variants of eglCreateSync*:
1555f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * eglCreateSync64KHR which requires EGL_KHR_cl_event2, and eglCreateSync
1556f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * which requires EGL 1.5. Here we use the presence of EGL_KHR_cl_event2
1557f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * support as a proxy for EGL 1.5 support, even though that's not
1558f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * entirely correct (though _eglComputeVersion does the same).
1559f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       *
1560f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * The EGL spec provides no guidance on how to handle unsupported
1561f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * functions. EGL_BAD_MATCH seems reasonable.
1562f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       */
1563f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
1564f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace   }
1565290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
15669a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   /* return an error if the client API doesn't support GL_OES_EGL_sync */
15679a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman   if (!ctx || ctx->Resource.Display != disp ||
15689a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák       ctx->ClientAPI != EGL_OPENGL_ES_API)
15699a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
15709a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák
15719a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   switch (type) {
15729a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   case EGL_SYNC_FENCE_KHR:
15739a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      if (!disp->Extensions.KHR_fence_sync)
157451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák         RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
15759a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      break;
15769a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   case EGL_SYNC_REUSABLE_KHR:
15779a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      if (!disp->Extensions.KHR_reusable_sync)
157851c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák         RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
15799a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      break;
1580290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák   case EGL_SYNC_CL_EVENT_KHR:
1581290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák      if (!disp->Extensions.KHR_cl_event2)
158251c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák         RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
1583290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák      break;
15849a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   default:
158551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák      RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
15869a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   }
15874eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
1588804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
15894ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
15904eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
15914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
15924eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
15934eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
15944eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
1595d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLSync EGLAPIENTRY
1596804488518296fbf20b06244bc0aa2e2793c61998Chad VersaceeglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *int_list)
1597290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák{
15989a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
15996a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
1600804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1601804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   EGLSync sync;
1602804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   EGLAttrib *attrib_list;
1603804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   EGLint err;
1604804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1605804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   if (sizeof(int_list[0]) == sizeof(attrib_list[0])) {
1606804488518296fbf20b06244bc0aa2e2793c61998Chad Versace      attrib_list = (EGLAttrib *) int_list;
1607804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   } else {
1608804488518296fbf20b06244bc0aa2e2793c61998Chad Versace      err = _eglConvertIntsToAttribs(int_list, &attrib_list);
1609804488518296fbf20b06244bc0aa2e2793c61998Chad Versace      if (err != EGL_SUCCESS)
1610804488518296fbf20b06244bc0aa2e2793c61998Chad Versace         RETURN_EGL_ERROR(disp, err, EGL_NO_SYNC);
1611804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   }
1612804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1613804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   sync = _eglCreateSync(disp, type, attrib_list, EGL_FALSE,
161451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák                         EGL_BAD_ATTRIBUTE);
1615804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1616804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   if (sizeof(int_list[0]) != sizeof(attrib_list[0]))
1617804488518296fbf20b06244bc0aa2e2793c61998Chad Versace      free(attrib_list);
1618804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1619804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   /* Don't double-unlock the display. _eglCreateSync already unlocked it. */
1620804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   return sync;
162151c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák}
162251c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák
162351c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák
162451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšákstatic EGLSync EGLAPIENTRY
162551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek OlšákeglCreateSync64KHR(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
162651c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák{
16279a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
16286a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
1629804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   return _eglCreateSync(disp, type, attrib_list, EGL_TRUE,
163051c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák                         EGL_BAD_ATTRIBUTE);
1631290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák}
1632290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
1633290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
16342885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLSync EGLAPIENTRY
16352885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
1636290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák{
16379a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
16386a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
1639804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   return _eglCreateSync(disp, type, attrib_list, EGL_TRUE,
164051c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák                         EGL_BAD_PARAMETER);
1641290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák}
1642290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
1643290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
16442885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLBoolean EGLAPIENTRY
16452885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglDestroySync(EGLDisplay dpy, EGLSync sync)
16464eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
16474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
16484eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
16494eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
16504eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
16514eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
16526a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
16536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
16544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
16559a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   assert(disp->Extensions.KHR_reusable_sync ||
16569a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák          disp->Extensions.KHR_fence_sync);
16576b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
16584eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _eglUnlinkSync(s);
16594eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.DestroySyncKHR(drv, disp, s);
16604eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
16614eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
16624eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
16634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
16644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
16652885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLint EGLAPIENTRY
16662885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
16674eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
16684eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
16694eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
16704eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
16714eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLint ret;
16724eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
16736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
16746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
16754eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
16769a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   assert(disp->Extensions.KHR_reusable_sync ||
16779a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák          disp->Extensions.KHR_fence_sync);
16789a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák
16799a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   if (s->SyncStatus == EGL_SIGNALED_KHR)
16809a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      RETURN_EGL_EVAL(disp, EGL_CONDITION_SATISFIED_KHR);
16819a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák
168270299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   /* if sync type is EGL_SYNC_REUSABLE_KHR, dpy should be
168370299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    * unlocked here to allow other threads also to be able to
168470299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    * go into waiting state.
168570299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    */
168670299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim
168770299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   if (s->Type == EGL_SYNC_REUSABLE_KHR)
168870299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim      _eglUnlockDisplay(dpy);
168970299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim
16904eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout);
16914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
169270299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   /*
169370299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    * 'disp' is already unlocked for reusable sync type,
169470299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    * so passing 'NULL' to bypass unlocking display.
169570299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    */
169670299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   if (s->Type == EGL_SYNC_REUSABLE_KHR)
169770299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim      RETURN_EGL_EVAL(NULL, ret);
169870299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   else
169970299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim      RETURN_EGL_EVAL(disp, ret);
17004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
17014eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17024eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17035b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brennemanstatic EGLint
17045b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman_eglWaitSyncCommon(_EGLDisplay *disp, _EGLSync *s, EGLint flags)
1705a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák{
1706a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   _EGLContext *ctx = _eglGetCurrentContext();
1707a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   _EGLDriver *drv;
1708a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   EGLint ret;
1709a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1710a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
1711a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   assert(disp->Extensions.KHR_wait_sync);
1712a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1713a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   /* return an error if the client API doesn't support GL_OES_EGL_sync */
1714a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   if (ctx == EGL_NO_CONTEXT || ctx->ClientAPI != EGL_OPENGL_ES_API)
1715a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
1716a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1717a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   /* the API doesn't allow any flags yet */
1718a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   if (flags != 0)
1719a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1720a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1721a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   ret = drv->API.WaitSyncKHR(drv, disp, s);
1722a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1723a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   RETURN_EGL_EVAL(disp, ret);
1724a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák}
1725a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
17265b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brennemanstatic EGLint EGLAPIENTRY
17275b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle BrennemaneglWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags)
17285b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman{
17295b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
17305b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   _EGLSync *s = _eglLookupSync(sync, disp);
17316a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
17325b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   return _eglWaitSyncCommon(disp, s, flags);
17335b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman}
17345b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman
1735a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
17367524592da6305d52e95d718691d5a6665738aadeMarek OlšákEGLBoolean EGLAPIENTRY
17377524592da6305d52e95d718691d5a6665738aadeMarek OlšákeglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
17387524592da6305d52e95d718691d5a6665738aadeMarek Olšák{
17397524592da6305d52e95d718691d5a6665738aadeMarek Olšák   /* The KHR version returns EGLint, while the core version returns
17407524592da6305d52e95d718691d5a6665738aadeMarek Olšák    * EGLBoolean. In both cases, the return values can only be EGL_FALSE and
17417524592da6305d52e95d718691d5a6665738aadeMarek Olšák    * EGL_TRUE.
17427524592da6305d52e95d718691d5a6665738aadeMarek Olšák    */
17435b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
17445b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   _EGLSync *s = _eglLookupSync(sync, disp);
17456a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
17465b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   return _eglWaitSyncCommon(disp, s, flags);
17477524592da6305d52e95d718691d5a6665738aadeMarek Olšák}
17487524592da6305d52e95d718691d5a6665738aadeMarek Olšák
17497524592da6305d52e95d718691d5a6665738aadeMarek Olšák
1750e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
1751d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglSignalSyncKHR(EGLDisplay dpy, EGLSync sync, EGLenum mode)
17524eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
17534eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
17544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
17554eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
17564eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
17574eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
17596a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
17604eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
17616b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
17624eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.SignalSyncKHR(drv, disp, s, mode);
17634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
17654eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
17664eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17674eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17681d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brennemanstatic EGLBoolean
17691d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman_eglGetSyncAttribCommon(_EGLDisplay *disp, _EGLSync *s, EGLint attribute, EGLAttrib *value)
17704eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
17714eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
17724eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
17734eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17744eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
17759a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   assert(disp->Extensions.KHR_reusable_sync ||
17769a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák          disp->Extensions.KHR_fence_sync);
17771e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   ret = drv->API.GetSyncAttrib(drv, disp, s, attribute, value);
17784eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17794eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
17804eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
17814eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17821d535c1e83ae45b67a141420298c5d08082e0ed8Kyle BrennemanEGLBoolean EGLAPIENTRY
17831d535c1e83ae45b67a141420298c5d08082e0ed8Kyle BrennemaneglGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value)
17841d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman{
17851d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
17861d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   _EGLSync *s = _eglLookupSync(sync, disp);
17876a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
17881d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   return _eglGetSyncAttribCommon(disp, s, attribute, value);
17891d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman}
17901d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman
17914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17921e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšákstatic EGLBoolean EGLAPIENTRY
17931e79e054e7dff0c45538fff1257e1f81a206d7c9Marek OlšákeglGetSyncAttribKHR(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLint *value)
17941e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák{
17951d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
17961d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   _EGLSync *s = _eglLookupSync(sync, disp);
1797d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim   EGLAttrib attrib;
1798d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim   EGLBoolean result;
1799d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim
18006a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
18016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1802d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim   if (!value)
180317084b6f9340f798111e53e08f5d35c7630cee48Chad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1804d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim
1805d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim   attrib = *value;
18061d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   result = _eglGetSyncAttribCommon(disp, s, attribute, &attrib);
18071e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák
18081e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   /* The EGL_KHR_fence_sync spec says this about eglGetSyncAttribKHR:
18091e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák    *
18101e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák    *    If any error occurs, <*value> is not modified.
18111e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák    */
18121e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   if (result == EGL_FALSE)
18131e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák      return result;
18141e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák
18151e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   *value = attrib;
18161e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   return result;
18171e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák}
18181e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák
18191e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák
1820e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
182152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
182252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg			EGLint numRects, const EGLint *rects)
182352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{
182452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLContext *ctx = _eglGetCurrentContext();
182552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
182652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLSurface *surf = _eglLookupSurface(surface, disp);
182752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDriver *drv;
182852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   EGLBoolean ret;
182952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
18306a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
18316a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
183252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
183352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
18346b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.NOK_swap_region)
18356b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
18366b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
183752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   /* surface must be bound to current context in EGL 1.4 */
1838d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1839d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
184052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
184152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
18426b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
184352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
184452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
184552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg}
184652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
1847b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1848d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLImage EGLAPIENTRY
1849b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
1850b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1851b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1852b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1853b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img;
1854d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák   EGLImage ret;
1855b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
18566a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
18576a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1858b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
18596b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.MESA_drm_image)
18606b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1861b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1862b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
18634ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1864b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1865b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1866b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1867b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1868e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
1869d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDRMImageMESA(EGLDisplay dpy, EGLImage image,
1870b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg		      EGLint *name, EGLint *handle, EGLint *stride)
1871b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1872b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1873b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img = _eglLookupImage(image, disp);
1874b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1875b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   EGLBoolean ret;
1876b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
18776a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
18786a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1879b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
18806b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.MESA_drm_image);
18816b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
1882b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   if (!img)
1883b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1884b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1885b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   ret = drv->API.ExportDRMImageMESA(drv, disp, img, name, handle, stride);
1886b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1887b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1888b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1889b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
18906b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
18916b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestruct wl_display;
18926b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
1893e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
18946b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
18956b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
18966b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
18976b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
18986b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
18996b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19006a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
19016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
19026b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
19036b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
19046b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19056b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
19066b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
19076b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19086b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.BindWaylandDisplayWL(drv, disp, display);
19096b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19106b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
19116b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
19126b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
1913e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
19146b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
19156b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
19166b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
19176b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
19186b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
19196b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19206a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
19216a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
19226b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
19236b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
19246b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19256b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
19266b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
19276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.UnbindWaylandDisplayWL(drv, disp, display);
19296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19306b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
19316b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
1932e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1933e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
19348d29b5271a2e66fc78436be31ed6748ff006f0cbAnder Conselvan de OliveiraeglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer,
1935e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg                        EGLint attribute, EGLint *value)
1936e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg{
1937e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1938e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGLDriver *drv;
1939e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   EGLBoolean ret;
1940e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
19416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
19426a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1943e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
1944e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   assert(disp->Extensions.WL_bind_wayland_display);
1945e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1946e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   if (!buffer)
1947e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1948e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1949e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   ret = drv->API.QueryWaylandBufferWL(drv, disp, buffer, attribute, value);
1950e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1951e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1952e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg}
19537d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
1954720125ff99a8563d1f5991bd7428b8d884f1f618Emil Velikov
1955e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic struct wl_buffer * EGLAPIENTRY
1956d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglCreateWaylandBufferFromImageWL(EGLDisplay dpy, EGLImage image)
19575cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts{
19585cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   _EGLDisplay *disp = _eglLockDisplay(dpy);
19595cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   _EGLImage *img;
19605cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   _EGLDriver *drv;
19615cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   struct wl_buffer *ret;
19625cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
19636a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
19646a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
19655cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   _EGL_CHECK_DISPLAY(disp, NULL, drv);
19665cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   assert(disp->Extensions.WL_create_wayland_buffer_from_image);
19675cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
19685cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   img = _eglLookupImage(image, disp);
19695cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
19705cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   if (!img)
19715cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL);
19725cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
19735cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   ret = drv->API.CreateWaylandBufferFromImageWL(drv, disp, img);
19745cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
19755cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   RETURN_EGL_EVAL(disp, ret);
19765cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts}
19777d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
1978e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
19797d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik HöglundeglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface,
19807d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund                   EGLint x, EGLint y, EGLint width, EGLint height)
19817d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund{
19827d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLDisplay *disp = _eglLockDisplay(dpy);
19837d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLSurface *surf = _eglLookupSurface(surface, disp);
19847d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLDriver *drv;
19857d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   EGLBoolean ret;
19867d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
19876a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
19886a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
19897d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
19907d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
19917d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   if (!disp->Extensions.NV_post_sub_buffer)
19927d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund      RETURN_EGL_EVAL(disp, EGL_FALSE);
19937d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
19947d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   ret = drv->API.PostSubBufferNV(drv, disp, surf, x, y, width, height);
19957d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
19967d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   RETURN_EGL_EVAL(disp, ret);
19977d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund}
1998c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
1999e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
2000c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah SharpeglGetSyncValuesCHROMIUM(EGLDisplay display, EGLSurface surface,
2001c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp                         EGLuint64KHR *ust, EGLuint64KHR *msc,
2002c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp                         EGLuint64KHR *sbc)
2003c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp{
2004c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   _EGLDisplay *disp = _eglLockDisplay(display);
2005c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   _EGLSurface *surf = _eglLookupSurface(surface, disp);
2006c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   _EGLDriver *drv;
2007c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   EGLBoolean ret;
2008c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
20096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
20106a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2011c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
2012c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   if (!disp->Extensions.CHROMIUM_sync_control)
2013c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp      RETURN_EGL_EVAL(disp, EGL_FALSE);
2014c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
2015c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   if (!ust || !msc || !sbc)
2016c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2017c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
2018c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   ret = drv->API.GetSyncValuesCHROMIUM(disp, surf, ust, msc, sbc);
2019c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
2020c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   RETURN_EGL_EVAL(disp, ret);
2021c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp}
20228f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
2023e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
2024d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDMABUFImageQueryMESA(EGLDisplay dpy, EGLImage image,
20258f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie                              EGLint *fourcc, EGLint *nplanes,
2026b5045e29917a783be74becee5e72566e2b0e3535Dave Airlie                              EGLuint64KHR *modifiers)
20278f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie{
20288f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLDisplay *disp = _eglLockDisplay(dpy);
20298f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLImage *img = _eglLookupImage(image, disp);
20308f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLDriver *drv;
20318f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   EGLBoolean ret;
20328f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
20336a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
20346a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
20358f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
20368f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   assert(disp->Extensions.MESA_image_dma_buf_export);
20378f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
20388f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   if (!img)
20398f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
20408f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
20418f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   ret = drv->API.ExportDMABUFImageQueryMESA(drv, disp, img, fourcc, nplanes,
20428f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie                                             modifiers);
20438f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
20448f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   RETURN_EGL_EVAL(disp, ret);
20458f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie}
20468f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
2047e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
2048d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDMABUFImageMESA(EGLDisplay dpy, EGLImage image,
20498f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie                         int *fds, EGLint *strides, EGLint *offsets)
20508f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie{
20518f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLDisplay *disp = _eglLockDisplay(dpy);
20528f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLImage *img = _eglLookupImage(image, disp);
20538f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLDriver *drv;
20548f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   EGLBoolean ret;
20558f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
20566a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
20576a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
20588f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
20598f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   assert(disp->Extensions.MESA_image_dma_buf_export);
20608f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
20618f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   if (!img)
20628f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
20638f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
20648f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   ret = drv->API.ExportDMABUFImageMESA(drv, disp, img, fds, strides, offsets);
20658f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
20668f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   RETURN_EGL_EVAL(disp, ret);
20678f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie}
2068e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov
2069ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLint EGLAPIENTRY
2070ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglLabelObjectKHR(EGLDisplay dpy, EGLenum objectType, EGLObjectKHR object,
2071ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman		  EGLLabelKHR label)
2072ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{
2073ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGLDisplay *disp = NULL;
2074ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGLResourceType type;
2075ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2076ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC);
2077ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2078ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (objectType == EGL_OBJECT_THREAD_KHR) {
2079ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _EGLThreadInfo *t = _eglGetCurrentThread();
2080ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2081ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      if (!_eglIsCurrentThreadDummy()) {
2082ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         t->Label = label;
2083ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         return EGL_SUCCESS;
2084ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      }
2085ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2086ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_BAD_ALLOC);
2087ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2088ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2089ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   disp = _eglLockDisplay(dpy);
2090ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (disp == NULL)
2091ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_BAD_DISPLAY);
2092ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2093ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (objectType == EGL_OBJECT_DISPLAY_KHR) {
2094ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      if (dpy != (EGLDisplay) object)
2095ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2096ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2097ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      disp->Label = label;
2098ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      RETURN_EGL_EVAL(disp, EGL_SUCCESS);
2099ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2100ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2101ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   switch (objectType) {
2102ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_CONTEXT_KHR:
2103ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         type = _EGL_RESOURCE_CONTEXT;
2104ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2105ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_SURFACE_KHR:
2106ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         type = _EGL_RESOURCE_SURFACE;
2107ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2108ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_IMAGE_KHR:
2109ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         type = _EGL_RESOURCE_IMAGE;
2110ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2111ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_SYNC_KHR:
2112ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         type = _EGL_RESOURCE_SYNC;
2113ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2114ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_STREAM_KHR:
2115ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      default:
2116ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2117ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2118ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2119ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (_eglCheckResource(object, type, disp)) {
2120ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _EGLResource *res = (_EGLResource *) object;
2121ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2122ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      res->Label = label;
2123ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      RETURN_EGL_EVAL(disp, EGL_SUCCESS);
2124ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2125ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2126ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2127ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman}
2128ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2129ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLBoolean
2130ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemanvalidDebugMessageLevel(EGLAttrib level)
2131ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{
2132ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   return (level >= EGL_DEBUG_MSG_CRITICAL_KHR &&
2133ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman           level <= EGL_DEBUG_MSG_INFO_KHR);
2134ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman}
2135ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2136ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLint EGLAPIENTRY
2137ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglDebugMessageControlKHR(EGLDEBUGPROCKHR callback,
2138ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman			  const EGLAttrib *attrib_list)
2139ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{
2140ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   unsigned int newEnabled;
2141ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2142ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC);
2143ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2144ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   mtx_lock(_eglGlobal.Mutex);
2145ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2146ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   newEnabled = _eglGlobal.debugTypesEnabled;
2147ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (attrib_list != NULL) {
2148ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      int i;
2149ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2150ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      for (i = 0; attrib_list[i] != EGL_NONE; i += 2) {
2151ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         if (validDebugMessageLevel(attrib_list[i])) {
2152ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            if (attrib_list[i + 1])
2153ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman               newEnabled |= DebugBitFromType(attrib_list[i]);
2154ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            else
2155ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman               newEnabled &= ~DebugBitFromType(attrib_list[i]);
2156ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            continue;
2157ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         }
2158ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2159ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         // On error, set the last error code, call the current
2160ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         // debug callback, and return the error code.
2161ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         mtx_unlock(_eglGlobal.Mutex);
2162ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         _eglReportError(EGL_BAD_ATTRIBUTE, NULL,
2163ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman               "Invalid attribute 0x%04lx", (unsigned long) attrib_list[i]);
2164ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         return EGL_BAD_ATTRIBUTE;
2165ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      }
2166ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2167ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2168ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (callback != NULL) {
2169ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglGlobal.debugCallback = callback;
2170ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglGlobal.debugTypesEnabled = newEnabled;
2171ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   } else {
2172ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglGlobal.debugCallback = NULL;
2173ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglGlobal.debugTypesEnabled = _EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR;
2174ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2175ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2176ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   mtx_unlock(_eglGlobal.Mutex);
2177ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   return EGL_SUCCESS;
2178ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman}
2179ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2180ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLBoolean EGLAPIENTRY
2181ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglQueryDebugKHR(EGLint attribute, EGLAttrib *value)
2182ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{
2183ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC);
2184ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2185ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   mtx_lock(_eglGlobal.Mutex);
2186ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2187ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   do {
2188ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      if (validDebugMessageLevel(attribute)) {
2189ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         if (_eglGlobal.debugTypesEnabled & DebugBitFromType(attribute))
2190ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            *value = EGL_TRUE;
2191ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         else
2192ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            *value = EGL_FALSE;
2193ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2194ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      }
2195ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2196ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      if (attribute == EGL_DEBUG_CALLBACK_KHR) {
2197ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         *value = (EGLAttrib) _eglGlobal.debugCallback;
2198ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2199ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      }
2200ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2201ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      mtx_unlock(_eglGlobal.Mutex);
2202ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglReportError(EGL_BAD_ATTRIBUTE, NULL,
2203ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman              "Invalid attribute 0x%04lx", (unsigned long) attribute);
2204ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      return EGL_FALSE;
2205ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   } while (0);
2206ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2207ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   mtx_unlock(_eglGlobal.Mutex);
2208ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   return EGL_TRUE;
2209ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman}
2210ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2211e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov__eglMustCastToProperFunctionPointerType EGLAPIENTRY
2212e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil VelikoveglGetProcAddress(const char *procname)
2213e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov{
2214e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   static const struct {
2215e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      const char *name;
2216e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      _EGLProc function;
2217e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   } egl_functions[] = {
2218448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov      /* core functions queryable in the presence of
2219448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov       * EGL_KHR_get_all_proc_addresses or EGL 1.5
2220448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov       */
2221e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      /* alphabetical order */
2222e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglBindAPI", (_EGLProc) eglBindAPI },
2223e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglBindTexImage", (_EGLProc) eglBindTexImage },
2224e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglChooseConfig", (_EGLProc) eglChooseConfig },
2225e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCopyBuffers", (_EGLProc) eglCopyBuffers },
2226e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateContext", (_EGLProc) eglCreateContext },
2227e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePbufferFromClientBuffer", (_EGLProc) eglCreatePbufferFromClientBuffer },
2228e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface },
2229e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface },
2230e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface },
2231e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglDestroyContext", (_EGLProc) eglDestroyContext },
2232e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglDestroySurface", (_EGLProc) eglDestroySurface },
2233e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib },
2234e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetConfigs", (_EGLProc) eglGetConfigs },
2235e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext },
2236e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay },
2237e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface },
2238e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetDisplay", (_EGLProc) eglGetDisplay },
2239e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetError", (_EGLProc) eglGetError },
2240e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetProcAddress", (_EGLProc) eglGetProcAddress },
2241e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglInitialize", (_EGLProc) eglInitialize },
2242e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglMakeCurrent", (_EGLProc) eglMakeCurrent },
2243e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQueryAPI", (_EGLProc) eglQueryAPI },
2244e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQueryContext", (_EGLProc) eglQueryContext },
2245e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQueryString", (_EGLProc) eglQueryString },
2246e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQuerySurface", (_EGLProc) eglQuerySurface },
2247e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage },
2248e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglReleaseThread", (_EGLProc) eglReleaseThread },
2249e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSurfaceAttrib", (_EGLProc) eglSurfaceAttrib },
2250e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSwapBuffers", (_EGLProc) eglSwapBuffers },
2251e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSwapInterval", (_EGLProc) eglSwapInterval },
2252e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglTerminate", (_EGLProc) eglTerminate },
2253e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglWaitClient", (_EGLProc) eglWaitClient },
2254e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglWaitGL", (_EGLProc) eglWaitGL },
2255e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglWaitNative", (_EGLProc) eglWaitNative },
22562885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglCreateSync", (_EGLProc) eglCreateSync },
22572885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglDestroySync", (_EGLProc) eglDestroySync },
22582885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglClientWaitSync", (_EGLProc) eglClientWaitSync },
22591e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák      { "eglGetSyncAttrib", (_EGLProc) eglGetSyncAttrib },
22607524592da6305d52e95d718691d5a6665738aadeMarek Olšák      { "eglWaitSync", (_EGLProc) eglWaitSync },
2261515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák      { "eglCreateImage", (_EGLProc) eglCreateImage },
22622885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglDestroyImage", (_EGLProc) eglDestroyImage },
2263820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák      { "eglGetPlatformDisplay", (_EGLProc) eglGetPlatformDisplay },
2264820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák      { "eglCreatePlatformWindowSurface", (_EGLProc) eglCreatePlatformWindowSurface },
2265820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák      { "eglCreatePlatformPixmapSurface", (_EGLProc) eglCreatePlatformPixmapSurface },
2266e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
22672885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImage },
2268e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateSyncKHR", (_EGLProc) eglCreateSyncKHR },
226951c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák      { "eglCreateSync64KHR", (_EGLProc) eglCreateSync64KHR },
22702885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglDestroySyncKHR", (_EGLProc) eglDestroySync },
22712885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglClientWaitSyncKHR", (_EGLProc) eglClientWaitSync },
2272e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglWaitSyncKHR", (_EGLProc) eglWaitSyncKHR },
2273e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSignalSyncKHR", (_EGLProc) eglSignalSyncKHR },
2274e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetSyncAttribKHR", (_EGLProc) eglGetSyncAttribKHR },
2275e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK },
2276e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateDRMImageMESA", (_EGLProc) eglCreateDRMImageMESA },
2277e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglExportDRMImageMESA", (_EGLProc) eglExportDRMImageMESA },
2278e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglBindWaylandDisplayWL", (_EGLProc) eglBindWaylandDisplayWL },
2279e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglUnbindWaylandDisplayWL", (_EGLProc) eglUnbindWaylandDisplayWL },
2280e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQueryWaylandBufferWL", (_EGLProc) eglQueryWaylandBufferWL },
2281e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateWaylandBufferFromImageWL", (_EGLProc) eglCreateWaylandBufferFromImageWL },
2282e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglPostSubBufferNV", (_EGLProc) eglPostSubBufferNV },
2283e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSwapBuffersWithDamageEXT", (_EGLProc) eglSwapBuffersWithDamageEXT },
22840a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom      { "eglSwapBuffersWithDamageKHR", (_EGLProc) eglSwapBuffersWithDamageKHR },
2285e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetPlatformDisplayEXT", (_EGLProc) eglGetPlatformDisplayEXT },
2286e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePlatformWindowSurfaceEXT", (_EGLProc) eglCreatePlatformWindowSurfaceEXT },
2287e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePlatformPixmapSurfaceEXT", (_EGLProc) eglCreatePlatformPixmapSurfaceEXT },
2288e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetSyncValuesCHROMIUM", (_EGLProc) eglGetSyncValuesCHROMIUM },
2289e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglExportDMABUFImageQueryMESA", (_EGLProc) eglExportDMABUFImageQueryMESA },
2290e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglExportDMABUFImageMESA", (_EGLProc) eglExportDMABUFImageMESA },
2291ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      { "eglLabelObjectKHR", (_EGLProc) eglLabelObjectKHR },
2292ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      { "eglDebugMessageControlKHR", (_EGLProc) eglDebugMessageControlKHR },
2293ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      { "eglQueryDebugKHR", (_EGLProc) eglQueryDebugKHR },
2294e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { NULL, NULL }
2295e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   };
2296e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   EGLint i;
2297e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   _EGLProc ret;
2298e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov
2299e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   if (!procname)
2300e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      RETURN_EGL_SUCCESS(NULL, NULL);
2301e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov
23026a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, NULL);
23036a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2304e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   ret = NULL;
2305e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   if (strncmp(procname, "egl", 3) == 0) {
2306e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      for (i = 0; egl_functions[i].name; i++) {
2307e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov         if (strcmp(egl_functions[i].name, procname) == 0) {
2308e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov            ret = egl_functions[i].function;
2309e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov            break;
2310e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov         }
2311e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      }
2312e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   }
2313e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   if (!ret)
2314e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      ret = _eglGetDriverProc(procname);
2315e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov
2316e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   RETURN_EGL_SUCCESS(NULL, ret);
2317e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov}
2318b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2319b6eda708431b91a3b568da0efac845c08cb36796Marek Olšákstatic int
2320b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák_eglLockDisplayInterop(EGLDisplay dpy, EGLContext context,
2321b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák                       _EGLDisplay **disp, _EGLDriver **drv,
2322b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák                       _EGLContext **ctx)
2323b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{
2324b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2325b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   *disp = _eglLockDisplay(dpy);
2326b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (!*disp || !(*disp)->Initialized || !(*disp)->Driver) {
2327b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      if (*disp)
2328b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák         _eglUnlockDisplay(*disp);
2329b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      return MESA_GLINTEROP_INVALID_DISPLAY;
2330b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   }
2331b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2332b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   *drv = (*disp)->Driver;
2333b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2334b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   *ctx = _eglLookupContext(context, *disp);
2335b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (!*ctx ||
2336b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák       ((*ctx)->ClientAPI != EGL_OPENGL_API &&
2337b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák        (*ctx)->ClientAPI != EGL_OPENGL_ES_API)) {
2338b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      _eglUnlockDisplay(*disp);
2339b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      return MESA_GLINTEROP_INVALID_CONTEXT;
2340b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   }
2341b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2342b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   return MESA_GLINTEROP_SUCCESS;
2343b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák}
2344b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2345b5f9820d905a275bc01bbffa9b4927ec11286f8dEmil Velikovint
2346b6eda708431b91a3b568da0efac845c08cb36796Marek OlšákMesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context,
234713faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov                                struct mesa_glinterop_device_info *out)
2348b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{
2349b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLDisplay *disp;
2350b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLDriver *drv;
2351b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLContext *ctx;
2352b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   int ret;
2353b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2354b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx);
2355b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (ret != MESA_GLINTEROP_SUCCESS)
2356b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      return ret;
2357b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2358b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (drv->API.GLInteropQueryDeviceInfo)
2359b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      ret = drv->API.GLInteropQueryDeviceInfo(disp, ctx, out);
2360b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   else
2361b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      ret = MESA_GLINTEROP_UNSUPPORTED;
2362b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2363b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _eglUnlockDisplay(disp);
2364b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   return ret;
2365b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák}
2366b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2367b5f9820d905a275bc01bbffa9b4927ec11286f8dEmil Velikovint
2368b6eda708431b91a3b568da0efac845c08cb36796Marek OlšákMesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
236913faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov                             struct mesa_glinterop_export_in *in,
237013faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov                             struct mesa_glinterop_export_out *out)
2371b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{
2372b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLDisplay *disp;
2373b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLDriver *drv;
2374b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLContext *ctx;
2375b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   int ret;
2376b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2377b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx);
2378b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (ret != MESA_GLINTEROP_SUCCESS)
2379b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      return ret;
2380b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2381b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (drv->API.GLInteropExportObject)
2382b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      ret = drv->API.GLInteropExportObject(disp, ctx, in, out);
2383b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   else
2384b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      ret = MESA_GLINTEROP_UNSUPPORTED;
2385b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2386b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _eglUnlockDisplay(disp);
2387b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   return ret;
2388b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák}
2389