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 */
2919e1d35ca75852d5b6ad24a7df278b2c3efc31a46Eric Engestromstatic EGLint
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
396a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#ifdef HAVE_SURFACELESS_PLATFORM
397a597c8ad5b75f37336257e3f4462caebacb621efChad Versace   case EGL_PLATFORM_SURFACELESS_MESA:
398a597c8ad5b75f37336257e3f4462caebacb621efChad Versace      dpy = _eglGetSurfacelessDisplay(native_display, attrib_list);
399a597c8ad5b75f37336257e3f4462caebacb621efChad Versace      break;
400a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#endif
401468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   default:
402468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL);
403468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   }
404468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
405468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglGetDisplayHandle(dpy);
406468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
407adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
408017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brennemanstatic EGLDisplay EGLAPIENTRY
409017946b7247ea7c36219b44dfc118ccad4da7d1dKyle BrennemaneglGetPlatformDisplayEXT(EGLenum platform, void *native_display,
410017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman                         const EGLint *attrib_list)
411017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman{
4126a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY);
413017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman   return _eglGetPlatformDisplayCommon(platform, native_display, attrib_list);
414017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman}
415017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman
416820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLDisplay EGLAPIENTRY
417820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglGetPlatformDisplay(EGLenum platform, void *native_display,
418820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                      const EGLAttrib *attrib_list)
419820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{
420820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   EGLDisplay display;
421017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman   EGLint *int_attribs;
422820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
4236a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY);
4246a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
425017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman   int_attribs = _eglConvertAttribsToInt(attrib_list);
426820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   if (attrib_list && !int_attribs)
427820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, NULL);
428820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
429017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman   display = _eglGetPlatformDisplayCommon(platform, native_display, int_attribs);
430820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   free(int_attribs);
431820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   return display;
432820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák}
433820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
4346052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
435dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * Copy the extension into the string and update the string pointer.
436dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner */
437dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic EGLint
438dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglAppendExtension(char **str, const char *ext)
439dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{
440dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   char *s = *str;
441dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   size_t len = strlen(ext);
442dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
443dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   if (s) {
444dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      memcpy(s, ext, len);
445dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      s[len++] = ' ';
446dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      s[len] = '\0';
447dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
448dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      *str += len;
449dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   }
450dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   else {
451dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      len++;
452dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   }
453dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
454dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   return (EGLint) len;
455dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner}
456dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
457dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner/**
458dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * Examine the individual extension enable/disable flags and recompute
459dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * the driver's Extensions string.
460dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner */
461dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic void
462dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglCreateExtensionsString(_EGLDisplay *dpy)
463dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{
464dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner#define _EGL_CHECK_EXTENSION(ext)                                          \
465dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   do {                                                                    \
466dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      if (dpy->Extensions.ext) {                                           \
467dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner         _eglAppendExtension(&exts, "EGL_" #ext);                          \
468dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner         assert(exts <= dpy->ExtensionsString + _EGL_MAX_EXTENSIONS_LEN);  \
469dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      }                                                                    \
470dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   } while (0)
471dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
472dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   char *exts = dpy->ExtensionsString;
473dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
47432aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   /* Please keep these sorted alphabetically. */
4758975527f58afd4af77966c6e46b485fc04008779Rob Herring   _EGL_CHECK_EXTENSION(ANDROID_framebuffer_target);
47632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(ANDROID_image_native_buffer);
4770201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   _EGL_CHECK_EXTENSION(ANDROID_native_fence_sync);
478e21e81aa1885287e438970429d44abb8b3dabb96Rob Herring   _EGL_CHECK_EXTENSION(ANDROID_recordable);
479dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
48032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(CHROMIUM_sync_control);
481dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
48232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(EXT_buffer_age);
48332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(EXT_create_context_robustness);
48432aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import);
48532aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage);
486dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
48732aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_cl_event2);
48826541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov   _EGL_CHECK_EXTENSION(KHR_config_attribs);
48932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_create_context);
49032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_fence_sync);
491dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(KHR_get_all_proc_addresses);
49232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_gl_colorspace);
49332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_gl_renderbuffer_image);
494dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(KHR_gl_texture_2D_image);
495dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(KHR_gl_texture_3D_image);
49632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_gl_texture_cubemap_image);
49732aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   if (dpy->Extensions.KHR_image_base && dpy->Extensions.KHR_image_pixmap)
49832aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák      _eglAppendExtension(&exts, "EGL_KHR_image");
49932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_image_base);
50032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_image_pixmap);
501d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson   _EGL_CHECK_EXTENSION(KHR_no_config_context);
502dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(KHR_reusable_sync);
50332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(KHR_surfaceless_context);
5040a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   if (dpy->Extensions.EXT_swap_buffers_with_damage)
5050a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom      _eglAppendExtension(&exts, "EGL_KHR_swap_buffers_with_damage");
506a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   _EGL_CHECK_EXTENSION(KHR_wait_sync);
507dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
508d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson   if (dpy->Extensions.KHR_no_config_context)
509d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson      _eglAppendExtension(&exts, "EGL_MESA_configless_context");
51032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(MESA_drm_image);
51132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(MESA_image_dma_buf_export);
512dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
513dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(NOK_swap_region);
514dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(NOK_texture_from_pixmap);
515dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
516dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   _EGL_CHECK_EXTENSION(NV_post_sub_buffer);
5178f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
51832aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(WL_bind_wayland_display);
51932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák   _EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image);
52032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák
521dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner#undef _EGL_CHECK_EXTENSION
522dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner}
523dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
524dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic void
525dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglCreateAPIsString(_EGLDisplay *dpy)
526dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{
527dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   if (dpy->ClientAPIs & EGL_OPENGL_BIT)
528dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      strcat(dpy->ClientAPIsString, "OpenGL ");
529dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
53021edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova   if (dpy->ClientAPIs & EGL_OPENGL_ES_BIT ||
53121edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova       dpy->ClientAPIs & EGL_OPENGL_ES2_BIT ||
53221edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova       dpy->ClientAPIs & EGL_OPENGL_ES3_BIT_KHR) {
533dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      strcat(dpy->ClientAPIsString, "OpenGL_ES ");
53421edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova   }
535dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
536dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   if (dpy->ClientAPIs & EGL_OPENVG_BIT)
537dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      strcat(dpy->ClientAPIsString, "OpenVG ");
538dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
539dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner   assert(strlen(dpy->ClientAPIsString) < sizeof(dpy->ClientAPIsString));
540dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner}
541dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
542efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšákstatic void
543efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák_eglComputeVersion(_EGLDisplay *disp)
544efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák{
5450e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák   disp->Version = 14;
546a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák
547a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák   if (disp->Extensions.KHR_fence_sync &&
548a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_cl_event2 &&
549a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_wait_sync &&
550a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_image_base &&
551a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_texture_2D_image &&
552a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_texture_3D_image &&
553a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_texture_cubemap_image &&
554a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_renderbuffer_image &&
555a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_create_context &&
556a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.EXT_create_context_robustness &&
557a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_get_all_proc_addresses &&
558a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_gl_colorspace &&
559a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák       disp->Extensions.KHR_surfaceless_context)
560a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák      disp->Version = 15;
561efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák}
562dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
563dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner/**
5646052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
5656052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
5666052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
5671ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
568adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
569adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
570655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5717e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
5726a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
5736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
5742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
575bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
5762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
577a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
578f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      if (!_eglMatchDriver(disp, EGL_FALSE))
579f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
5802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
581310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
582a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      disp->ClientAPIs &= _EGL_API_ALL_BITS;
5837e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace
5847e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace      /* EGL_KHR_get_all_proc_addresses is a corner-case extension. The spec
5857e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * classifies it as an EGL display extension, though conceptually it's an
5867e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * EGL client extension.
5877e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *
5887e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * From the EGL_KHR_get_all_proc_addresses spec:
5897e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *
5907e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *    The EGL implementation must expose the name
5917e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *    EGL_KHR_client_get_all_proc_addresses if and only if it exposes
5927e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *    EGL_KHR_get_all_proc_addresses and supports
5937e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *    EGL_EXT_client_extensions.
5947e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       *
5957e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * Mesa unconditionally exposes both client extensions mentioned above,
5967e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * so the spec requires that each EGLDisplay unconditionally expose
5977e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       * EGL_KHR_get_all_proc_addresses also.
5987e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace       */
5997e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace      disp->Extensions.KHR_get_all_proc_addresses = EGL_TRUE;
600dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner
60126541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov      /* Extensions is used to provide EGL 1.3 functionality for 1.2 aware
60226541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov       * programs. It is driver agnostic and handled in the main EGL code.
60326541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov       */
60426541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov      disp->Extensions.KHR_config_attribs = EGL_TRUE;
60526541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov
606efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák      _eglComputeVersion(disp);
607dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      _eglCreateExtensionsString(disp);
608dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner      _eglCreateAPIsString(disp);
6093593f37fd7b599e217bd1f894ac671a14a058b8dEmil Velikov      snprintf(disp->VersionString, sizeof(disp->VersionString),
6100e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák              "%d.%d (%s)", disp->Version / 10, disp->Version % 10,
611dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner              disp->Driver->Name);
612adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
6132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
6152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
6160e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák      *major = disp->Version / 10;
6170e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák      *minor = disp->Version % 10;
6182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
6192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
620bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
621adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
622adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
623adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6241ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
625adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
626adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
627655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
6282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6296a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
6306a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
6312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
632bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
6332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
634a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (disp->Initialized) {
635a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
636a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu
637ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
638a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      /* do not reset disp->Driver */
63937e3a116f8ae09d0fa894d126d081a1af24ec14fDave Airlie      disp->ClientAPIsString[0] = 0;
640a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_FALSE;
6412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
6422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
643bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
6442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
6452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6471ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
648adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
649adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6503c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace   _EGLDisplay *disp;
651aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
652aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
6533c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace   if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) {
6543c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace      RETURN_EGL_SUCCESS(NULL, _eglGlobal.ClientExtensionString);
6553c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace   }
6563c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace
6573c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace   disp = _eglLockDisplay(dpy);
6586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, NULL);
659bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, NULL, drv);
660b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
6616c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   switch (name) {
6626c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   case EGL_VENDOR:
6636c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_SUCCESS(disp, _EGL_VENDOR_STRING);
6646c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   case EGL_VERSION:
6656c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_SUCCESS(disp, disp->VersionString);
6666c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   case EGL_EXTENSIONS:
6676c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_SUCCESS(disp, disp->ExtensionsString);
6686c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   case EGL_CLIENT_APIS:
6696c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_SUCCESS(disp, disp->ClientAPIsString);
6706c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   default:
6716c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL);
6726c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner   }
673adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
674adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
675adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
6782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
679adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
680655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
681aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
682b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
683aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
6846a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
6856a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
686bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
687b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
688b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
689bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
690adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
691adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
692adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
6952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
696adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
697655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
698aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
699b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
700aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
7016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
7026a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
703bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
704b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs,
7052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
706b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
707bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
708adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
709adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
710adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7111ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
7132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
714adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
715655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
7162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
7172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
718b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7206a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
7216a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
722bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv);
723b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
724b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
725bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
726adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
727adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
728adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7291ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
7302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
7312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
7322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
733655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
7342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
7352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
7362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
738b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
7392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7406a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_CONTEXT);
7416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
7426b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
7436b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
7445876f3c85a61d73bb4863331bd641152a40a7b0cTapani Pälli   if (config != EGL_NO_CONFIG_KHR)
7455876f3c85a61d73bb4863331bd641152a40a7b0cTapani Pälli      _EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT, drv);
7465876f3c85a61d73bb4863331bd641152a40a7b0cTapani Pälli   else if (!disp->Extensions.KHR_no_config_context)
7474b17dff3e5128bef67ea79d20624e878c3b48729Neil Roberts      RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT);
748b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg
749b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!share && share_list != EGL_NO_CONTEXT)
750bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
7512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
7534ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT;
754b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
755bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
756adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
757adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
758adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7591ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
762655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
763aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
764aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
765b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
766aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
7676a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
7686a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
769bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
7702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
771b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyContext(drv, disp, context);
772b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
773bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
774adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
775adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
776adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7771ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
7792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
780adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
781655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
7822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
7832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
7842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
7852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
786b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7886a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
7896a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
79017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
791bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
79217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
79317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
79417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
79517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
79617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
79717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
798bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
79917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
8002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
801bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(disp, EGL_TRUE);
80217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
8032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
804bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
8056b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!draw_surf || !read_surf) {
8060ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor      /* From the EGL 1.4 (20130211) spec:
8070ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor       *
8080ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor       *    To release the current context without assigning a new one, set ctx
8090ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor       *    to EGL_NO_CONTEXT and set draw and read to EGL_NO_SURFACE.
8100ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor       */
8110ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor      if (!disp->Extensions.KHR_surfaceless_context && ctx != EGL_NO_CONTEXT)
8126b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
8136b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
8146b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if ((!draw_surf && draw != EGL_NO_SURFACE) ||
8156b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          (!read_surf && read != EGL_NO_SURFACE))
8166b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
8176b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (draw_surf || read_surf)
8186b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
8196b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   }
8202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
821b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
822b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
823bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
824adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
825adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
826adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8271ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
8282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
8292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
830adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
831655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
832aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
833aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
834b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
835aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
8366a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE);
8376a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
838bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
839b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryContext(drv, disp, context, attribute, value);
840b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
841bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
842adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
843adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
844adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
845468cc866b4b308cee40470f06b31002c6c56da96Chad Versacestatic EGLSurface
846468cc866b4b308cee40470f06b31002c6c56da96Chad Versace_eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
847468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                              void *native_window, const EGLint *attrib_list)
848adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
8502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
852b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
8532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
85491ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh
85591ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh   if (native_window == NULL)
85691ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
85791ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh
858a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#ifdef HAVE_SURFACELESS_PLATFORM
8595e97b8f5ce975dfb66cc46e6b4cc1e89eb8c1dc0Chad Versace   if (disp && disp->Platform == _EGL_PLATFORM_SURFACELESS) {
860a597c8ad5b75f37336257e3f4462caebacb621efChad Versace      /* From the EGL_MESA_platform_surfaceless spec (v1):
861a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *
862a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *    eglCreatePlatformWindowSurface fails when called with a <display>
863a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *    that belongs to the surfaceless platform. It returns
864a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *    EGL_NO_SURFACE and generates EGL_BAD_NATIVE_WINDOW. The
865a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *    justification for this unconditional failure is that the
866a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *    surfaceless platform has no native windows, and therefore the
867a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *    <native_window> parameter is always invalid.
868a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *
869a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       * This check must occur before checking the EGLConfig, which emits
870a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       * EGL_BAD_CONFIG.
871a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       */
872a597c8ad5b75f37336257e3f4462caebacb621efChad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
873a597c8ad5b75f37336257e3f4462caebacb621efChad Versace   }
874a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#endif
875a597c8ad5b75f37336257e3f4462caebacb621efChad Versace
876a597c8ad5b75f37336257e3f4462caebacb621efChad Versace   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
877a597c8ad5b75f37336257e3f4462caebacb621efChad Versace
878fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace   if ((conf->SurfaceType & EGL_WINDOW_BIT) == 0)
879fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE);
880fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace
881468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window,
8826d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace                                       attrib_list);
8834ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
884b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
885bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
886adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
887adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
888adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8891ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
890468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
891468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                       EGLNativeWindowType window, const EGLint *attrib_list)
892adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
893655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
8946a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
8956a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
896468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   STATIC_ASSERT(sizeof(void*) == sizeof(window));
897468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglCreateWindowSurfaceCommon(disp, config, (void*) window,
898468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                        attrib_list);
899468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
900468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
9017d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brennemanstatic void *
9024729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom_fixupNativeWindow(_EGLDisplay *disp, void *native_window)
903468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
904468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_X11_PLATFORM
905468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   if (disp->Platform == _EGL_PLATFORM_X11 && native_window != NULL) {
906468cc866b4b308cee40470f06b31002c6c56da96Chad Versace      /* The `native_window` parameter for the X11 platform differs between
907468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * eglCreateWindowSurface() and eglCreatePlatformPixmapSurfaceEXT(). In
908468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * eglCreateWindowSurface(), the type of `native_window` is an Xlib
909468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * `Window`. In eglCreatePlatformWindowSurfaceEXT(), the type is
910468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * `Window*`.  Convert `Window*` to `Window` because that's what
911468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       * dri2_x11_create_window_surface() expects.
912468cc866b4b308cee40470f06b31002c6c56da96Chad Versace       */
9137d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman      return (void *)(* (Window*) native_window);
914468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   }
915468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif
9167d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   return native_window;
9177d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman}
9187d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman
9197d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brennemanstatic EGLSurface EGLAPIENTRY
9207d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle BrennemaneglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config,
9217d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman                                  void *native_window,
9227d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman                                  const EGLint *attrib_list)
9237d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman{
9247d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
9257d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman
9264729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom   native_window = _fixupNativeWindow(disp, native_window);
927468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
9286a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
929468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglCreateWindowSurfaceCommon(disp, config, native_window,
930468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                        attrib_list);
931468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
932468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
933468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
934820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLSurface EGLAPIENTRY
935820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config,
936820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                               void *native_window,
937820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                               const EGLAttrib *attrib_list)
938820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{
9397d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
940820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   EGLSurface surface;
9416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   EGLint *int_attribs;
9426a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
9436a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
944820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
9456a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   int_attribs = _eglConvertAttribsToInt(attrib_list);
946820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   if (attrib_list && !int_attribs)
9476a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
948820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
9494729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom   native_window = _fixupNativeWindow(disp, native_window);
9507d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman   surface = _eglCreateWindowSurfaceCommon(disp, config, native_window,
9517d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman                                           int_attribs);
952820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   free(int_attribs);
953820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   return surface;
954820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák}
955820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
9568cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brennemanstatic void *
9574729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom_fixupNativePixmap(_EGLDisplay *disp, void *native_pixmap)
9588cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman{
9598cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman#ifdef HAVE_X11_PLATFORM
9608cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman      /* The `native_pixmap` parameter for the X11 platform differs between
9618cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * eglCreatePixmapSurface() and eglCreatePlatformPixmapSurfaceEXT(). In
9628cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * eglCreatePixmapSurface(), the type of `native_pixmap` is an Xlib
9638cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * `Pixmap`. In eglCreatePlatformPixmapSurfaceEXT(), the type is
9648cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * `Pixmap*`.  Convert `Pixmap*` to `Pixmap` because that's what
9658cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       * dri2_x11_create_pixmap_surface() expects.
9668cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman       */
9678cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   if (disp->Platform == _EGL_PLATFORM_X11 && native_pixmap != NULL)
9688cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman      return (void *)(* (Pixmap*) native_pixmap);
9698cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman#endif
9708cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   return native_pixmap;
9718cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman}
972820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
973468cc866b4b308cee40470f06b31002c6c56da96Chad Versacestatic EGLSurface
974468cc866b4b308cee40470f06b31002c6c56da96Chad Versace_eglCreatePixmapSurfaceCommon(_EGLDisplay *disp, EGLConfig config,
975468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                              void *native_pixmap, const EGLint *attrib_list)
976468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
9772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
9782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
980b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
9812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
982a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#if HAVE_SURFACELESS_PLATFORM
9835e97b8f5ce975dfb66cc46e6b4cc1e89eb8c1dc0Chad Versace   if (disp && disp->Platform == _EGL_PLATFORM_SURFACELESS) {
984a597c8ad5b75f37336257e3f4462caebacb621efChad Versace      /* From the EGL_MESA_platform_surfaceless spec (v1):
985a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *
986a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *   [Like eglCreatePlatformWindowSurface,] eglCreatePlatformPixmapSurface
987a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *   also fails when called with a <display> that belongs to the
988a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *   surfaceless platform.  It returns EGL_NO_SURFACE and generates
989a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *   EGL_BAD_NATIVE_PIXMAP.
990a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       *
991a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       * This check must occur before checking the EGLConfig, which emits
992a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       * EGL_BAD_CONFIG.
993a597c8ad5b75f37336257e3f4462caebacb621efChad Versace       */
994a597c8ad5b75f37336257e3f4462caebacb621efChad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
995a597c8ad5b75f37336257e3f4462caebacb621efChad Versace   }
996a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#endif
997a597c8ad5b75f37336257e3f4462caebacb621efChad Versace
998bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
999fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace
1000fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace   if ((conf->SurfaceType & EGL_PIXMAP_BIT) == 0)
1001fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE);
1002fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace
1003468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap,
10046d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace                                       attrib_list);
10054ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1006b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1007bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1008adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1009adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1010adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10111ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
1012468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
1013468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
1014468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
1015468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   _EGLDisplay *disp = _eglLockDisplay(dpy);
10166a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
10176a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
1018468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   STATIC_ASSERT(sizeof(void*) == sizeof(pixmap));
1019468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglCreatePixmapSurfaceCommon(disp, config, (void*) pixmap,
1020468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                         attrib_list);
1021468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
1022468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
1023e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLSurface EGLAPIENTRY
1024468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config,
1025468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                   void *native_pixmap,
1026468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                   const EGLint *attrib_list)
1027468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{
1028468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   _EGLDisplay *disp = _eglLockDisplay(dpy);
1029468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
10306a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
10314729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom   native_pixmap = _fixupNativePixmap(disp, native_pixmap);
1032468cc866b4b308cee40470f06b31002c6c56da96Chad Versace   return _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap,
1033468cc866b4b308cee40470f06b31002c6c56da96Chad Versace                                        attrib_list);
1034468cc866b4b308cee40470f06b31002c6c56da96Chad Versace}
1035468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
1036468cc866b4b308cee40470f06b31002c6c56da96Chad Versace
1037468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceEGLSurface EGLAPIENTRY
1038820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config,
1039820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                               void *native_pixmap,
1040820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák                               const EGLAttrib *attrib_list)
1041820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{
10428cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
1043820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   EGLSurface surface;
10446a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   EGLint *int_attribs;
10456a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
10466a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
1047820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
10486a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   int_attribs = _eglConvertAttribsToInt(attrib_list);
1049820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   if (attrib_list && !int_attribs)
10506a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE);
1051820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
10524729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom   native_pixmap = _fixupNativePixmap(disp, native_pixmap);
10538cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman   surface = _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap,
10548cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman                                           int_attribs);
1055820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   free(int_attribs);
1056820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák   return surface;
1057820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák}
1058820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
1059820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák
1060820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLSurface EGLAPIENTRY
10612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
10622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
1063adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1064655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
10662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1068b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
10692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
10706a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
1071bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
10722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1073fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace   if ((conf->SurfaceType & EGL_PBUFFER_BIT) == 0)
1074fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE);
1075fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace
10762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
10774ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1078b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1079bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1080adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1081adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1082adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10831ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1084adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
1085adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1086655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1087aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1088aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1089b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1090aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
10916a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1092bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
10932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
1094b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroySurface(drv, disp, surf);
1095b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1096bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1097adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1098adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10991ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
11002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
11012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
1102adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1103655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1104aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1105aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1106b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1107aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
11086a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1109bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1110b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
1111b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1113adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1114adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11151ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
11162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
11172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
1118adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1119655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1120aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1121aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1122b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1123aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
11246a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1126b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
1127b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1128bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1129adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1130adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1131adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11321ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1133adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1134adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1135655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1136aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1137aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1138b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1139aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
11406a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1141bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1142b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.BindTexImage(drv, disp, surf, buffer);
1143b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1144bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1145adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1146adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1147adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11481ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1149adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
1150adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1151655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1152aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1153aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1154b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1155aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
11566a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1157bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1158b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer);
1159b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1160bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1161adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1162adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1163adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1165adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
1166adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1167655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
116857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
11696a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGLSurface *surf = ctx ? ctx->DrawSurface : NULL;
1170aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1171b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1172aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
11736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1174bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
117557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
1176d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1177d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       ctx->Resource.Display != disp)
1178bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
117957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
1180d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE)
1181bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
118257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
1183b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapInterval(drv, disp, surf, interval);
1184b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1185bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1186adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1187adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1188adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
11891ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
11902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
1191adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1192bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
1193655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1194aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1195aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1196b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1197aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
11986a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
1199bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
1200bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
1201bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
1202400b833592d9aad7b2c4627a897380642d52189fAlexander von Gluck IV   #ifndef _EGL_BUILT_IN_DRIVER_HAIKU
1203d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1204d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
1205bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
1206400b833592d9aad7b2c4627a897380642d52189fAlexander von Gluck IV   #endif
1207b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1208b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapBuffers(drv, disp, surf);
1209bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
1210bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1211adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1212adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1213adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
12140a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean
12159702f9136646acc6981880faa3962a11aab1a603Eric Engestrom_eglSwapBuffersWithDamageCommon(_EGLDisplay *disp, _EGLSurface *surf,
12169702f9136646acc6981880faa3962a11aab1a603Eric Engestrom                                EGLint *rects, EGLint n_rects)
12176425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg{
12186425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   _EGLContext *ctx = _eglGetCurrentContext();
12196425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   _EGLDriver *drv;
12206425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   EGLBoolean ret;
12216425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
12226425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
12236425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
12246425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   /* surface must be bound to current context in EGL 1.4 */
12256425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
12266425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg       surf != ctx->DrawSurface)
12276425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
12286425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
12296425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   if ((n_rects > 0 && rects == NULL) || n_rects < 0)
12306425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
12316425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
12326425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   ret = drv->API.SwapBuffersWithDamageEXT(drv, disp, surf, rects, n_rects);
12336425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
12346425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg   RETURN_EGL_EVAL(disp, ret);
12356425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg}
12366425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg
12370a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean EGLAPIENTRY
12380a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageEXT(EGLDisplay dpy, EGLSurface surface,
12390a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom                            EGLint *rects, EGLint n_rects)
12400a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom{
12410a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGLDisplay *disp = _eglLockDisplay(dpy);
12420a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGLSurface *surf = _eglLookupSurface(surface, disp);
12430a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
12449702f9136646acc6981880faa3962a11aab1a603Eric Engestrom   return _eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects);
12450a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom}
12460a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom
12470a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean EGLAPIENTRY
12480a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface,
12490a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom                            EGLint *rects, EGLint n_rects)
12500a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom{
12510a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGLDisplay *disp = _eglLockDisplay(dpy);
12520a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGLSurface *surf = _eglLookupSurface(surface, disp);
12530a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
12549702f9136646acc6981880faa3962a11aab1a603Eric Engestrom   return _eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects);
12550a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom}
12560a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom
12571ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
12584aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
1259adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1260655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1261aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
1262aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1263b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
12646d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   void *native_pixmap_ptr;
12656d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace
12666a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
12676d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   STATIC_ASSERT(sizeof(void*) == sizeof(target));
12686d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   native_pixmap_ptr = (void*) target;
1269aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1270bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
127185fe9484945cb57ffd49df248b0e5057eba6af04Benjamin Franzke   if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay))
1272f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE);
12736d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace   ret = drv->API.CopyBuffers(drv, disp, surf, native_pixmap_ptr);
1274b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1275bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1276adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1277adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1278adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
127982a2e2cb5024c37a1779594320f23f225a83c79dKyle Brennemanstatic EGLBoolean
128082a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman_eglWaitClientCommon(void)
1281adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
12826c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
12836c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
12842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1285b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
12862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
12876c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
1288bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
12892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1290ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
1291efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov   mtx_lock(&disp->Mutex);
1292655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
1293655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   /* let bad current context imply bad current surface */
1294d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1295d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
1296bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
1297b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1298b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
1299a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
13002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1301b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitClient(drv, disp, ctx);
13026c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
1303bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13046c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
13056c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
130682a2e2cb5024c37a1779594320f23f225a83c79dKyle BrennemanEGLBoolean EGLAPIENTRY
130782a2e2cb5024c37a1779594320f23f225a83c79dKyle BrennemaneglWaitClient(void)
130882a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman{
13096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext(), EGL_FALSE);
131082a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman   return _eglWaitClientCommon();
131182a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman}
13122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
13136c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
13146c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
13156c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
13166e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman   /* Since we only support OpenGL and GLES, eglWaitGL is equivalent to eglWaitClient. */
13176a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext(), EGL_FALSE);
131882a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman   return _eglWaitClientCommon();
1319adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1320adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1321adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
13221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
1323adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
1324adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
13256c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
13266c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
13272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1328b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
13292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
13306c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
1331bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1332b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
13336a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE);
13346a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1335655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   disp = ctx->Resource.Display;
1336efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov   mtx_lock(&disp->Mutex);
1337655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
13386c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
1339d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1340d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
1341bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
1342b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1343b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
1344a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
13452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1346b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitNative(drv, disp, engine);
13472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1348bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1349adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
13521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
1353adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
1354adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1355a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
1356b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLDisplay ret;
1357b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1358b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
1359b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1360bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1361adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1362adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1363adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
13641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
1365adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
1366adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1367adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
1368b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
1369b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1370b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetContextHandle(ctx);
1371b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1372bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1373adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1374adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1375adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
13761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
1377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
1378adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
137961906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
1380b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLint err = EGL_SUCCESS;
138161906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
1382b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
138361906631202af855d0742586956ff9f34522a525Chia-I Wu
13846a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_NO_SURFACE);
13856a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
138661906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
1387bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
138861906631202af855d0742586956ff9f34522a525Chia-I Wu
138961906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
139061906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
139161906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
139261906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
139361906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
139461906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
139561906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
139661906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
139761906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
1398b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      err = EGL_BAD_PARAMETER;
139961906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
140061906631202af855d0742586956ff9f34522a525Chia-I Wu   }
140161906631202af855d0742586956ff9f34522a525Chia-I Wu
1402b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetSurfaceHandle(surf);
1403b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1404bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(NULL, err, ret);
1405adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1406adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1407adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
14081ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
1409adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
1410adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
141148822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
141248822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
141375da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
141475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
1415adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
1416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1419b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
1420b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
1421b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
1422b2006a40eb22899d38cd31691640555228e36975Brian Paul
1423d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1424d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
1425d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
1426d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
1427d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
1428d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
1429d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1430d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
1431d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
1432d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
1433d5078b94323241a6482f54797756116b1c864327Brian Paul */
1434c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1435b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
1436b2006a40eb22899d38cd31691640555228e36975Brian Paul{
14376a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGLThreadInfo *t;
1438b2006a40eb22899d38cd31691640555228e36975Brian Paul
14396a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE);
14406a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
14416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   t = _eglGetCurrentThread();
144275da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
1443bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
144475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
144521b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
1446bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
144721b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
14486e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman   t->CurrentAPI = api;
1449b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1450bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1451b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1452b2006a40eb22899d38cd31691640555228e36975Brian Paul
1453b2006a40eb22899d38cd31691640555228e36975Brian Paul
1454d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1455d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1456d5078b94323241a6482f54797756116b1c864327Brian Paul */
1457c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY
1458d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1459d5078b94323241a6482f54797756116b1c864327Brian Paul{
1460d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1461b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLenum ret;
1462b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1463b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
14646e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman   ret = t->CurrentAPI;
1465b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1466bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1467d5078b94323241a6482f54797756116b1c864327Brian Paul}
1468d5078b94323241a6482f54797756116b1c864327Brian Paul
1469d5078b94323241a6482f54797756116b1c864327Brian Paul
1470c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
1471b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1472b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1473b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1474b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1475655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
14762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
14772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
14782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1479b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
14802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
14816a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE);
14826a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1483bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
14842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
14852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
14862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
14874ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1488b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1489bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1490b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1491b2006a40eb22899d38cd31691640555228e36975Brian Paul
1492b2006a40eb22899d38cd31691640555228e36975Brian Paul
1493c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1494b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1495b2006a40eb22899d38cd31691640555228e36975Brian Paul{
149611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
14972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
149811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
14996e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      _EGLContext *ctx = t->CurrentContext;
15006a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
15016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman      _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE);
15026a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
15036e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      if (ctx) {
15046e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         _EGLDisplay *disp = ctx->Resource.Display;
15056e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         _EGLDriver *drv;
15066e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman
15076e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         mtx_lock(&disp->Mutex);
15086e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         drv = disp->Driver;
15096e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
15106e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman         mtx_unlock(&disp->Mutex);
15116e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman      }
1512b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
15132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
151475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1515b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1516bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1517b2006a40eb22899d38cd31691640555228e36975Brian Paul}
15187012d01d888d482f2c6ad1180231a482026d213aJon Smirl
15197012d01d888d482f2c6ad1180231a482026d213aJon Smirl
152058338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brennemanstatic EGLImage
152158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman_eglCreateImageCommon(_EGLDisplay *disp, EGLContext ctx, EGLenum target,
1522a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1523a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1524a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1525a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1526a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1527d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák   EGLImage ret;
1528a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1529bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
15306b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
15316b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1532b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
1533bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
15340de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen   /* "If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid display,
15350de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen    *  <ctx> must be EGL_NO_CONTEXT..."
15360de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen    */
15370de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen   if (ctx != EGL_NO_CONTEXT && target == EGL_LINUX_DMA_BUF_EXT)
15380de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
1539a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1540a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1541a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
15424ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1543b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1544bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1545a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1546a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
154758338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brennemanstatic EGLImage EGLAPIENTRY
154858338c6b650d85a2484f50c0941cb3e2947fab8eKyle BrennemaneglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
154958338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman                  EGLClientBuffer buffer, const EGLint *attr_list)
155058338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman{
155158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
15526a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_IMAGE_KHR);
155358338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman   return _eglCreateImageCommon(disp, ctx, target, buffer, attr_list);
155458338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman}
155558338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman
1556a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1557515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek OlšákEGLImage EGLAPIENTRY
1558515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek OlšákeglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1559515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák               EGLClientBuffer buffer, const EGLAttrib *attr_list)
1560515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák{
156158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
1562515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   EGLImage image;
15636a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   EGLint *int_attribs;
15646a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
15656a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_IMAGE_KHR);
1566515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
15676a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   int_attribs = _eglConvertAttribsToInt(attr_list);
1568515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   if (attr_list && !int_attribs)
156958338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman      RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_IMAGE);
1570515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
157158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman   image = _eglCreateImageCommon(disp, ctx, target, buffer, int_attribs);
1572515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   free(int_attribs);
1573515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák   return image;
1574515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák}
1575515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
1576515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák
15772885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLBoolean EGLAPIENTRY
15782885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglDestroyImage(EGLDisplay dpy, EGLImage image)
1579a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1580655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1581a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1582a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1583b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1584a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
15856a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
15866a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1587bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
15886b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
15896b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
1590a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1591bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1592a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1593a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1594b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyImageKHR(drv, disp, img);
1595b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1596bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1597a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1598a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1599a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1600d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLSync
1601804488518296fbf20b06244bc0aa2e2793c61998Chad Versace_eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_list,
1602804488518296fbf20b06244bc0aa2e2793c61998Chad Versace               EGLBoolean orig_is_EGLAttrib,
160351c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák               EGLenum invalid_type_error)
16044eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
16059a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   _EGLContext *ctx = _eglGetCurrentContext();
16064eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
16074eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *sync;
1608d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák   EGLSync ret;
16094eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
16104eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
16119a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák
1612804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   if (!disp->Extensions.KHR_cl_event2 && orig_is_EGLAttrib) {
1613f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace      /* There exist two EGLAttrib variants of eglCreateSync*:
1614f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * eglCreateSync64KHR which requires EGL_KHR_cl_event2, and eglCreateSync
1615f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * which requires EGL 1.5. Here we use the presence of EGL_KHR_cl_event2
1616f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * support as a proxy for EGL 1.5 support, even though that's not
1617f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * entirely correct (though _eglComputeVersion does the same).
1618f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       *
1619f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * The EGL spec provides no guidance on how to handle unsupported
1620f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       * functions. EGL_BAD_MATCH seems reasonable.
1621f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace       */
1622f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
1623f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace   }
1624290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
16256bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli   /* If type is EGL_SYNC_FENCE and no context is current for the bound API
16266bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli    * (i.e., eglGetCurrentContext returns EGL_NO_CONTEXT ), an EGL_BAD_MATCH
16276bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli    * error is generated.
16286bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli    */
16290201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   if (!ctx &&
16300201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark       (type == EGL_SYNC_FENCE_KHR || type == EGL_SYNC_NATIVE_FENCE_ANDROID))
16316bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
16326bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli
16339a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   /* return an error if the client API doesn't support GL_OES_EGL_sync */
16346bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli   if (ctx && (ctx->Resource.Display != disp ||
16356bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli       ctx->ClientAPI != EGL_OPENGL_ES_API))
16369a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR);
16379a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák
16389a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   switch (type) {
16399a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   case EGL_SYNC_FENCE_KHR:
16409a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      if (!disp->Extensions.KHR_fence_sync)
164151c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák         RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
16429a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      break;
16439a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   case EGL_SYNC_REUSABLE_KHR:
16449a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      if (!disp->Extensions.KHR_reusable_sync)
164551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák         RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
16469a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      break;
1647290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák   case EGL_SYNC_CL_EVENT_KHR:
1648290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák      if (!disp->Extensions.KHR_cl_event2)
164951c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák         RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
1650290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák      break;
16510201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   case EGL_SYNC_NATIVE_FENCE_ANDROID:
16520201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark      if (!disp->Extensions.ANDROID_native_fence_sync)
16530201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark         RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
16540201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark      break;
16559a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   default:
165651c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák      RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR);
16579a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   }
16584eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
1659804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
16604ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
16614eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
16624eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
16634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
16644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
16654eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
1666d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLSync EGLAPIENTRY
1667804488518296fbf20b06244bc0aa2e2793c61998Chad VersaceeglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *int_list)
1668290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák{
16699a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
16706a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
1671804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1672804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   EGLSync sync;
1673804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   EGLAttrib *attrib_list;
1674804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   EGLint err;
1675804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1676804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   if (sizeof(int_list[0]) == sizeof(attrib_list[0])) {
1677804488518296fbf20b06244bc0aa2e2793c61998Chad Versace      attrib_list = (EGLAttrib *) int_list;
1678804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   } else {
1679804488518296fbf20b06244bc0aa2e2793c61998Chad Versace      err = _eglConvertIntsToAttribs(int_list, &attrib_list);
1680804488518296fbf20b06244bc0aa2e2793c61998Chad Versace      if (err != EGL_SUCCESS)
1681804488518296fbf20b06244bc0aa2e2793c61998Chad Versace         RETURN_EGL_ERROR(disp, err, EGL_NO_SYNC);
1682804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   }
1683804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1684804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   sync = _eglCreateSync(disp, type, attrib_list, EGL_FALSE,
168551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák                         EGL_BAD_ATTRIBUTE);
1686804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1687804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   if (sizeof(int_list[0]) != sizeof(attrib_list[0]))
1688804488518296fbf20b06244bc0aa2e2793c61998Chad Versace      free(attrib_list);
1689804488518296fbf20b06244bc0aa2e2793c61998Chad Versace
1690804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   /* Don't double-unlock the display. _eglCreateSync already unlocked it. */
1691804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   return sync;
169251c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák}
169351c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák
169451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák
169551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšákstatic EGLSync EGLAPIENTRY
169651c8c66e1d81d03f0db6aee0a510aa85c277053eMarek OlšákeglCreateSync64KHR(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
169751c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák{
16989a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
16996a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
1700804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   return _eglCreateSync(disp, type, attrib_list, EGL_TRUE,
170151c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák                         EGL_BAD_ATTRIBUTE);
1702290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák}
1703290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
1704290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
17052885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLSync EGLAPIENTRY
17062885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
1707290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák{
17089a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
17096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
1710804488518296fbf20b06244bc0aa2e2793c61998Chad Versace   return _eglCreateSync(disp, type, attrib_list, EGL_TRUE,
171151c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák                         EGL_BAD_PARAMETER);
1712290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák}
1713290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
1714290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák
17152885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLBoolean EGLAPIENTRY
17162885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglDestroySync(EGLDisplay dpy, EGLSync sync)
17174eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
17184eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
17194eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
17204eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
17214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
17224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17236a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
17246a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
17254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
17269a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   assert(disp->Extensions.KHR_reusable_sync ||
17270201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark          disp->Extensions.KHR_fence_sync ||
17280201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark          disp->Extensions.ANDROID_native_fence_sync);
17296b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
17304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _eglUnlinkSync(s);
17314eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.DestroySyncKHR(drv, disp, s);
17324eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17334eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
17344eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
17354eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17364eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17372885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLint EGLAPIENTRY
17382885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout)
17394eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
17404eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
17414eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
17424eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
17434eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLint ret;
17444eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17456a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
17466a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
17474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
17489a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   assert(disp->Extensions.KHR_reusable_sync ||
17490201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark          disp->Extensions.KHR_fence_sync ||
17500201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark          disp->Extensions.ANDROID_native_fence_sync);
17519a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák
17529a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   if (s->SyncStatus == EGL_SIGNALED_KHR)
17539a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák      RETURN_EGL_EVAL(disp, EGL_CONDITION_SATISFIED_KHR);
17549a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák
175570299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   /* if sync type is EGL_SYNC_REUSABLE_KHR, dpy should be
175670299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    * unlocked here to allow other threads also to be able to
175770299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    * go into waiting state.
175870299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    */
175970299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim
176070299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   if (s->Type == EGL_SYNC_REUSABLE_KHR)
176170299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim      _eglUnlockDisplay(dpy);
176270299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim
17634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout);
17644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
176570299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   /*
176670299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    * 'disp' is already unlocked for reusable sync type,
176770299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    * so passing 'NULL' to bypass unlocking display.
176870299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim    */
176970299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   if (s->Type == EGL_SYNC_REUSABLE_KHR)
177070299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim      RETURN_EGL_EVAL(NULL, ret);
177170299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim   else
177270299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim      RETURN_EGL_EVAL(disp, ret);
17734eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
17744eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17754eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
17765b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brennemanstatic EGLint
17775b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman_eglWaitSyncCommon(_EGLDisplay *disp, _EGLSync *s, EGLint flags)
1778a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák{
1779a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   _EGLContext *ctx = _eglGetCurrentContext();
1780a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   _EGLDriver *drv;
1781a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   EGLint ret;
1782a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1783a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
1784a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   assert(disp->Extensions.KHR_wait_sync);
1785a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1786a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   /* return an error if the client API doesn't support GL_OES_EGL_sync */
1787a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   if (ctx == EGL_NO_CONTEXT || ctx->ClientAPI != EGL_OPENGL_ES_API)
1788a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák      RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
1789a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1790a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   /* the API doesn't allow any flags yet */
1791a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   if (flags != 0)
1792a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1793a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1794a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   ret = drv->API.WaitSyncKHR(drv, disp, s);
1795a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
1796a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák   RETURN_EGL_EVAL(disp, ret);
1797a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák}
1798a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
17995b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brennemanstatic EGLint EGLAPIENTRY
18005b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle BrennemaneglWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags)
18015b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman{
18025b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
18035b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   _EGLSync *s = _eglLookupSync(sync, disp);
18046a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
18055b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   return _eglWaitSyncCommon(disp, s, flags);
18065b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman}
18075b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman
1808a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák
18097524592da6305d52e95d718691d5a6665738aadeMarek OlšákEGLBoolean EGLAPIENTRY
18107524592da6305d52e95d718691d5a6665738aadeMarek OlšákeglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
18117524592da6305d52e95d718691d5a6665738aadeMarek Olšák{
18127524592da6305d52e95d718691d5a6665738aadeMarek Olšák   /* The KHR version returns EGLint, while the core version returns
18137524592da6305d52e95d718691d5a6665738aadeMarek Olšák    * EGLBoolean. In both cases, the return values can only be EGL_FALSE and
18147524592da6305d52e95d718691d5a6665738aadeMarek Olšák    * EGL_TRUE.
18157524592da6305d52e95d718691d5a6665738aadeMarek Olšák    */
18165b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
18175b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   _EGLSync *s = _eglLookupSync(sync, disp);
18186a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
18195b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman   return _eglWaitSyncCommon(disp, s, flags);
18207524592da6305d52e95d718691d5a6665738aadeMarek Olšák}
18217524592da6305d52e95d718691d5a6665738aadeMarek Olšák
18227524592da6305d52e95d718691d5a6665738aadeMarek Olšák
1823e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
1824d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglSignalSyncKHR(EGLDisplay dpy, EGLSync sync, EGLenum mode)
18254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
18264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
18274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
18284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
18294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
18304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
18316a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
18326a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
18334eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
18346b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
18354eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.SignalSyncKHR(drv, disp, s, mode);
18364eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
18374eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
18384eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
18394eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
18404eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
18411d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brennemanstatic EGLBoolean
18421d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman_eglGetSyncAttribCommon(_EGLDisplay *disp, _EGLSync *s, EGLint attribute, EGLAttrib *value)
18434eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
18444eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
18454eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
18464eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
18474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
18489a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák   assert(disp->Extensions.KHR_reusable_sync ||
18490201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark          disp->Extensions.KHR_fence_sync ||
18500201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark          disp->Extensions.ANDROID_native_fence_sync);
18511e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   ret = drv->API.GetSyncAttrib(drv, disp, s, attribute, value);
18524eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
18534eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
18544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
18554eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
18561d535c1e83ae45b67a141420298c5d08082e0ed8Kyle BrennemanEGLBoolean EGLAPIENTRY
18571d535c1e83ae45b67a141420298c5d08082e0ed8Kyle BrennemaneglGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value)
18581d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman{
18591d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
18601d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   _EGLSync *s = _eglLookupSync(sync, disp);
18616a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
18621d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   return _eglGetSyncAttribCommon(disp, s, attribute, value);
18631d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman}
18641d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman
18654eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
18661e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšákstatic EGLBoolean EGLAPIENTRY
18671e79e054e7dff0c45538fff1257e1f81a206d7c9Marek OlšákeglGetSyncAttribKHR(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLint *value)
18681e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák{
18691d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   _EGLDisplay *disp = _eglLockDisplay(dpy);
18701d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   _EGLSync *s = _eglLookupSync(sync, disp);
1871d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim   EGLAttrib attrib;
1872d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim   EGLBoolean result;
1873d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim
18746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
18756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1876d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim   if (!value)
187717084b6f9340f798111e53e08f5d35c7630cee48Chad Versace      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1878d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim
1879d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim   attrib = *value;
18801d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman   result = _eglGetSyncAttribCommon(disp, s, attribute, &attrib);
18811e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák
18821e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   /* The EGL_KHR_fence_sync spec says this about eglGetSyncAttribKHR:
18831e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák    *
18841e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák    *    If any error occurs, <*value> is not modified.
18851e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák    */
18861e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   if (result == EGL_FALSE)
18871e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák      return result;
18881e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák
18891e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   *value = attrib;
18901e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák   return result;
18911e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák}
18921e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák
18930201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clarkstatic EGLint EGLAPIENTRY
18940201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob ClarkeglDupNativeFenceFDANDROID(EGLDisplay dpy, EGLSync sync)
18950201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark{
18960201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   _EGLDisplay *disp = _eglLockDisplay(dpy);
18970201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   _EGLSync *s = _eglLookupSync(sync, disp);
18980201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   _EGLDriver *drv;
18990201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   EGLBoolean ret;
19000201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark
19010201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE);
19020201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark
19030201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   /* the spec doesn't seem to specify what happens if the fence
19040201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark    * type is not EGL_SYNC_NATIVE_FENCE_ANDROID, but this seems
19050201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark    * sensible:
19060201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark    */
19070201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   if (!(s && (s->Type == EGL_SYNC_NATIVE_FENCE_ANDROID)))
19080201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_NATIVE_FENCE_FD_ANDROID);
19090201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark
19100201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   _EGL_CHECK_SYNC(disp, s, EGL_NO_NATIVE_FENCE_FD_ANDROID, drv);
19110201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   assert(disp->Extensions.ANDROID_native_fence_sync);
19120201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   ret = drv->API.DupNativeFenceFDANDROID(drv, disp, s);
19130201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark
19140201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark   RETURN_EGL_EVAL(disp, ret);
19150201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark}
19161e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák
1917e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
191852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
191952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg			EGLint numRects, const EGLint *rects)
192052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{
192152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLContext *ctx = _eglGetCurrentContext();
192252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
192352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLSurface *surf = _eglLookupSurface(surface, disp);
192452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDriver *drv;
192552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   EGLBoolean ret;
192652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
19276a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
19286a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
192952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
193052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
19316b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.NOK_swap_region)
19326b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
19336b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
193452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   /* surface must be bound to current context in EGL 1.4 */
1935d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1936d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
193752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
193852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
19396b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
194052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
194152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
194252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg}
194352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
1944b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1945d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLImage EGLAPIENTRY
1946b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
1947b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1948b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1949b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1950b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img;
1951d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák   EGLImage ret;
1952b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
19536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
19546a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1955b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
19566b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.MESA_drm_image)
19576b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1958b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1959b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
19604ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1961b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1962b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1963b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1964b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1965e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
1966d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDRMImageMESA(EGLDisplay dpy, EGLImage image,
1967b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg		      EGLint *name, EGLint *handle, EGLint *stride)
1968b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1969b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1970b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img = _eglLookupImage(image, disp);
1971b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1972b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   EGLBoolean ret;
1973b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
19746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
19756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
1976b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
19776b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.MESA_drm_image);
19786b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
1979b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   if (!img)
1980b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1981b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1982b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   ret = drv->API.ExportDRMImageMESA(drv, disp, img, name, handle, stride);
1983b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1984b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1985b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1986b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
19876b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19886b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestruct wl_display;
19896b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
1990e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
19916b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
19926b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
19936b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
19946b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
19956b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
19966b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
19976a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
19986a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
19996b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
20006b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
20016b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
20026b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
20036b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
20046b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
20056b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.BindWaylandDisplayWL(drv, disp, display);
20066b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
20076b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
20086b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
20096b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
2010e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
20116b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
20126b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
20136b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
20146b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
20156b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
20166b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
20176a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
20186a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
20196b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
20206b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
20216b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
20226b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
20236b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
20246b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
20256b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.UnbindWaylandDisplayWL(drv, disp, display);
20266b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
20276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
20286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
2029e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
2030e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
20318d29b5271a2e66fc78436be31ed6748ff006f0cbAnder Conselvan de OliveiraeglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer,
2032e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg                        EGLint attribute, EGLint *value)
2033e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg{
2034e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
2035e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGLDriver *drv;
2036e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   EGLBoolean ret;
2037e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
20386a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
20396a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2040e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
2041e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   assert(disp->Extensions.WL_bind_wayland_display);
2042e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
2043e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   if (!buffer)
2044e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2045e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
2046e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   ret = drv->API.QueryWaylandBufferWL(drv, disp, buffer, attribute, value);
2047e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
2048e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
2049e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg}
20507d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
2051720125ff99a8563d1f5991bd7428b8d884f1f618Emil Velikov
2052e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic struct wl_buffer * EGLAPIENTRY
2053d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglCreateWaylandBufferFromImageWL(EGLDisplay dpy, EGLImage image)
20545cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts{
20555cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   _EGLDisplay *disp = _eglLockDisplay(dpy);
20565cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   _EGLImage *img;
20575cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   _EGLDriver *drv;
20585cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   struct wl_buffer *ret;
20595cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
20606a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE);
20616a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
20625cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   _EGL_CHECK_DISPLAY(disp, NULL, drv);
20635cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   assert(disp->Extensions.WL_create_wayland_buffer_from_image);
20645cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
20655cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   img = _eglLookupImage(image, disp);
20665cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
20675cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   if (!img)
20685cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL);
20695cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
20705cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   ret = drv->API.CreateWaylandBufferFromImageWL(drv, disp, img);
20715cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts
20725cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts   RETURN_EGL_EVAL(disp, ret);
20735cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts}
20747d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
2075e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
20767d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik HöglundeglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface,
20777d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund                   EGLint x, EGLint y, EGLint width, EGLint height)
20787d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund{
20797d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLDisplay *disp = _eglLockDisplay(dpy);
20807d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLSurface *surf = _eglLookupSurface(surface, disp);
20817d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLDriver *drv;
20827d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   EGLBoolean ret;
20837d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
20846a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
20856a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
20867d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
20877d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
20887d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   if (!disp->Extensions.NV_post_sub_buffer)
20897d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund      RETURN_EGL_EVAL(disp, EGL_FALSE);
20907d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
20917d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   ret = drv->API.PostSubBufferNV(drv, disp, surf, x, y, width, height);
20927d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
20937d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   RETURN_EGL_EVAL(disp, ret);
20947d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund}
2095c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
2096e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
2097c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah SharpeglGetSyncValuesCHROMIUM(EGLDisplay display, EGLSurface surface,
2098c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp                         EGLuint64KHR *ust, EGLuint64KHR *msc,
2099c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp                         EGLuint64KHR *sbc)
2100c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp{
2101c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   _EGLDisplay *disp = _eglLockDisplay(display);
2102c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   _EGLSurface *surf = _eglLookupSurface(surface, disp);
2103c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   _EGLDriver *drv;
2104c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   EGLBoolean ret;
2105c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
21066a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE);
21076a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2108c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
2109c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   if (!disp->Extensions.CHROMIUM_sync_control)
2110c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp      RETURN_EGL_EVAL(disp, EGL_FALSE);
2111c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
2112c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   if (!ust || !msc || !sbc)
2113c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
2114c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
2115c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   ret = drv->API.GetSyncValuesCHROMIUM(disp, surf, ust, msc, sbc);
2116c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp
2117c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp   RETURN_EGL_EVAL(disp, ret);
2118c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp}
21198f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
2120e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
2121d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDMABUFImageQueryMESA(EGLDisplay dpy, EGLImage image,
21228f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie                              EGLint *fourcc, EGLint *nplanes,
2123b5045e29917a783be74becee5e72566e2b0e3535Dave Airlie                              EGLuint64KHR *modifiers)
21248f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie{
21258f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLDisplay *disp = _eglLockDisplay(dpy);
21268f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLImage *img = _eglLookupImage(image, disp);
21278f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLDriver *drv;
21288f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   EGLBoolean ret;
21298f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
21306a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
21316a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
21328f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
21338f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   assert(disp->Extensions.MESA_image_dma_buf_export);
21348f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
21358f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   if (!img)
21368f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
21378f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
21388f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   ret = drv->API.ExportDMABUFImageQueryMESA(drv, disp, img, fourcc, nplanes,
21398f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie                                             modifiers);
21408f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
21418f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   RETURN_EGL_EVAL(disp, ret);
21428f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie}
21438f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
2144e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY
2145d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDMABUFImageMESA(EGLDisplay dpy, EGLImage image,
21468f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie                         int *fds, EGLint *strides, EGLint *offsets)
21478f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie{
21488f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLDisplay *disp = _eglLockDisplay(dpy);
21498f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLImage *img = _eglLookupImage(image, disp);
21508f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGLDriver *drv;
21518f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   EGLBoolean ret;
21528f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
21536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE);
21546a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
21558f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
21568f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   assert(disp->Extensions.MESA_image_dma_buf_export);
21578f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
21588f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   if (!img)
21598f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
21608f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
21618f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   ret = drv->API.ExportDMABUFImageMESA(drv, disp, img, fds, strides, offsets);
21628f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie
21638f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie   RETURN_EGL_EVAL(disp, ret);
21648f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie}
2165e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov
2166ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLint EGLAPIENTRY
2167ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglLabelObjectKHR(EGLDisplay dpy, EGLenum objectType, EGLObjectKHR object,
2168ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman		  EGLLabelKHR label)
2169ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{
2170ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGLDisplay *disp = NULL;
2171ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGLResourceType type;
2172ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2173ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC);
2174ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2175ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (objectType == EGL_OBJECT_THREAD_KHR) {
2176ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _EGLThreadInfo *t = _eglGetCurrentThread();
2177ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2178ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      if (!_eglIsCurrentThreadDummy()) {
2179ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         t->Label = label;
2180ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         return EGL_SUCCESS;
2181ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      }
2182ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2183ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_BAD_ALLOC);
2184ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2185ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2186ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   disp = _eglLockDisplay(dpy);
2187ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (disp == NULL)
2188ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_BAD_DISPLAY);
2189ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2190ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (objectType == EGL_OBJECT_DISPLAY_KHR) {
2191ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      if (dpy != (EGLDisplay) object)
2192ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2193ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2194ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      disp->Label = label;
2195ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      RETURN_EGL_EVAL(disp, EGL_SUCCESS);
2196ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2197ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2198ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   switch (objectType) {
2199ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_CONTEXT_KHR:
2200ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         type = _EGL_RESOURCE_CONTEXT;
2201ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2202ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_SURFACE_KHR:
2203ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         type = _EGL_RESOURCE_SURFACE;
2204ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2205ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_IMAGE_KHR:
2206ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         type = _EGL_RESOURCE_IMAGE;
2207ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2208ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_SYNC_KHR:
2209ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         type = _EGL_RESOURCE_SYNC;
2210ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2211ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      case EGL_OBJECT_STREAM_KHR:
2212ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      default:
2213ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2214ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2215ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2216ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (_eglCheckResource(object, type, disp)) {
2217ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _EGLResource *res = (_EGLResource *) object;
2218ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2219ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      res->Label = label;
2220ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      RETURN_EGL_EVAL(disp, EGL_SUCCESS);
2221ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2222ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2223ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER);
2224ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman}
2225ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2226ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLBoolean
22274729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom_validDebugMessageLevel(EGLAttrib level)
2228ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{
2229ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   return (level >= EGL_DEBUG_MSG_CRITICAL_KHR &&
2230ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman           level <= EGL_DEBUG_MSG_INFO_KHR);
2231ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman}
2232ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2233ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLint EGLAPIENTRY
2234ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglDebugMessageControlKHR(EGLDEBUGPROCKHR callback,
2235ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman			  const EGLAttrib *attrib_list)
2236ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{
2237ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   unsigned int newEnabled;
2238ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2239ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC);
2240ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2241ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   mtx_lock(_eglGlobal.Mutex);
2242ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2243ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   newEnabled = _eglGlobal.debugTypesEnabled;
2244ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (attrib_list != NULL) {
2245ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      int i;
2246ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2247ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      for (i = 0; attrib_list[i] != EGL_NONE; i += 2) {
22484729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom         if (_validDebugMessageLevel(attrib_list[i])) {
2249ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            if (attrib_list[i + 1])
2250ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman               newEnabled |= DebugBitFromType(attrib_list[i]);
2251ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            else
2252ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman               newEnabled &= ~DebugBitFromType(attrib_list[i]);
2253ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            continue;
2254ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         }
2255ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2256ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         // On error, set the last error code, call the current
2257ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         // debug callback, and return the error code.
2258ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         mtx_unlock(_eglGlobal.Mutex);
2259ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         _eglReportError(EGL_BAD_ATTRIBUTE, NULL,
2260ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman               "Invalid attribute 0x%04lx", (unsigned long) attrib_list[i]);
2261ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         return EGL_BAD_ATTRIBUTE;
2262ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      }
2263ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2264ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2265ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   if (callback != NULL) {
2266ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglGlobal.debugCallback = callback;
2267ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglGlobal.debugTypesEnabled = newEnabled;
2268ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   } else {
2269ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglGlobal.debugCallback = NULL;
2270ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglGlobal.debugTypesEnabled = _EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR;
2271ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   }
2272ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2273ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   mtx_unlock(_eglGlobal.Mutex);
2274ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   return EGL_SUCCESS;
2275ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman}
2276ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2277ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLBoolean EGLAPIENTRY
2278ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglQueryDebugKHR(EGLint attribute, EGLAttrib *value)
2279ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{
2280ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC);
2281ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2282ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   mtx_lock(_eglGlobal.Mutex);
2283ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2284ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   do {
22854729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom      if (_validDebugMessageLevel(attribute)) {
2286ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         if (_eglGlobal.debugTypesEnabled & DebugBitFromType(attribute))
2287ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            *value = EGL_TRUE;
2288ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         else
2289ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman            *value = EGL_FALSE;
2290ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2291ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      }
2292ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2293ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      if (attribute == EGL_DEBUG_CALLBACK_KHR) {
2294ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         *value = (EGLAttrib) _eglGlobal.debugCallback;
2295ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman         break;
2296ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      }
2297ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2298ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      mtx_unlock(_eglGlobal.Mutex);
2299ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      _eglReportError(EGL_BAD_ATTRIBUTE, NULL,
2300ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman              "Invalid attribute 0x%04lx", (unsigned long) attribute);
2301ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      return EGL_FALSE;
2302ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   } while (0);
2303ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2304ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   mtx_unlock(_eglGlobal.Mutex);
2305ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman   return EGL_TRUE;
2306ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman}
2307ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman
2308e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov__eglMustCastToProperFunctionPointerType EGLAPIENTRY
2309e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil VelikoveglGetProcAddress(const char *procname)
2310e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov{
2311e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   static const struct {
2312e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      const char *name;
2313e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      _EGLProc function;
2314e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   } egl_functions[] = {
2315448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov      /* core functions queryable in the presence of
2316448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov       * EGL_KHR_get_all_proc_addresses or EGL 1.5
2317448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov       */
2318e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      /* alphabetical order */
2319e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglBindAPI", (_EGLProc) eglBindAPI },
2320e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglBindTexImage", (_EGLProc) eglBindTexImage },
2321e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglChooseConfig", (_EGLProc) eglChooseConfig },
2322e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCopyBuffers", (_EGLProc) eglCopyBuffers },
2323e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateContext", (_EGLProc) eglCreateContext },
2324e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePbufferFromClientBuffer", (_EGLProc) eglCreatePbufferFromClientBuffer },
2325e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface },
2326e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface },
2327e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface },
2328e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglDestroyContext", (_EGLProc) eglDestroyContext },
2329e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglDestroySurface", (_EGLProc) eglDestroySurface },
2330e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib },
2331e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetConfigs", (_EGLProc) eglGetConfigs },
2332e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext },
2333e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay },
2334e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface },
2335e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetDisplay", (_EGLProc) eglGetDisplay },
2336e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetError", (_EGLProc) eglGetError },
2337e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetProcAddress", (_EGLProc) eglGetProcAddress },
2338e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglInitialize", (_EGLProc) eglInitialize },
2339e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglMakeCurrent", (_EGLProc) eglMakeCurrent },
2340e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQueryAPI", (_EGLProc) eglQueryAPI },
2341e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQueryContext", (_EGLProc) eglQueryContext },
2342e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQueryString", (_EGLProc) eglQueryString },
2343e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQuerySurface", (_EGLProc) eglQuerySurface },
2344e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage },
2345e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglReleaseThread", (_EGLProc) eglReleaseThread },
2346e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSurfaceAttrib", (_EGLProc) eglSurfaceAttrib },
2347e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSwapBuffers", (_EGLProc) eglSwapBuffers },
2348e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSwapInterval", (_EGLProc) eglSwapInterval },
2349e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglTerminate", (_EGLProc) eglTerminate },
2350e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglWaitClient", (_EGLProc) eglWaitClient },
2351e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglWaitGL", (_EGLProc) eglWaitGL },
2352e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglWaitNative", (_EGLProc) eglWaitNative },
23532885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglCreateSync", (_EGLProc) eglCreateSync },
23542885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglDestroySync", (_EGLProc) eglDestroySync },
23552885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglClientWaitSync", (_EGLProc) eglClientWaitSync },
23561e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák      { "eglGetSyncAttrib", (_EGLProc) eglGetSyncAttrib },
23577524592da6305d52e95d718691d5a6665738aadeMarek Olšák      { "eglWaitSync", (_EGLProc) eglWaitSync },
2358515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák      { "eglCreateImage", (_EGLProc) eglCreateImage },
23592885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglDestroyImage", (_EGLProc) eglDestroyImage },
2360820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák      { "eglGetPlatformDisplay", (_EGLProc) eglGetPlatformDisplay },
2361820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák      { "eglCreatePlatformWindowSurface", (_EGLProc) eglCreatePlatformWindowSurface },
2362820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák      { "eglCreatePlatformPixmapSurface", (_EGLProc) eglCreatePlatformPixmapSurface },
2363e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
23642885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImage },
2365e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateSyncKHR", (_EGLProc) eglCreateSyncKHR },
236651c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák      { "eglCreateSync64KHR", (_EGLProc) eglCreateSync64KHR },
23672885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglDestroySyncKHR", (_EGLProc) eglDestroySync },
23682885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák      { "eglClientWaitSyncKHR", (_EGLProc) eglClientWaitSync },
2369e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglWaitSyncKHR", (_EGLProc) eglWaitSyncKHR },
2370e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSignalSyncKHR", (_EGLProc) eglSignalSyncKHR },
2371e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetSyncAttribKHR", (_EGLProc) eglGetSyncAttribKHR },
2372e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK },
2373e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateDRMImageMESA", (_EGLProc) eglCreateDRMImageMESA },
2374e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglExportDRMImageMESA", (_EGLProc) eglExportDRMImageMESA },
2375e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglBindWaylandDisplayWL", (_EGLProc) eglBindWaylandDisplayWL },
2376e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglUnbindWaylandDisplayWL", (_EGLProc) eglUnbindWaylandDisplayWL },
2377e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglQueryWaylandBufferWL", (_EGLProc) eglQueryWaylandBufferWL },
2378e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreateWaylandBufferFromImageWL", (_EGLProc) eglCreateWaylandBufferFromImageWL },
2379e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglPostSubBufferNV", (_EGLProc) eglPostSubBufferNV },
2380e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglSwapBuffersWithDamageEXT", (_EGLProc) eglSwapBuffersWithDamageEXT },
23810a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom      { "eglSwapBuffersWithDamageKHR", (_EGLProc) eglSwapBuffersWithDamageKHR },
2382e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetPlatformDisplayEXT", (_EGLProc) eglGetPlatformDisplayEXT },
2383e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePlatformWindowSurfaceEXT", (_EGLProc) eglCreatePlatformWindowSurfaceEXT },
2384e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglCreatePlatformPixmapSurfaceEXT", (_EGLProc) eglCreatePlatformPixmapSurfaceEXT },
2385e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglGetSyncValuesCHROMIUM", (_EGLProc) eglGetSyncValuesCHROMIUM },
2386e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglExportDMABUFImageQueryMESA", (_EGLProc) eglExportDMABUFImageQueryMESA },
2387e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { "eglExportDMABUFImageMESA", (_EGLProc) eglExportDMABUFImageMESA },
2388ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      { "eglLabelObjectKHR", (_EGLProc) eglLabelObjectKHR },
2389ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      { "eglDebugMessageControlKHR", (_EGLProc) eglDebugMessageControlKHR },
2390ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman      { "eglQueryDebugKHR", (_EGLProc) eglQueryDebugKHR },
23910201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark      { "eglDupNativeFenceFDANDROID", (_EGLProc) eglDupNativeFenceFDANDROID },
2392e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      { NULL, NULL }
2393e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   };
2394e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   EGLint i;
2395e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   _EGLProc ret;
2396e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov
2397e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   if (!procname)
2398e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      RETURN_EGL_SUCCESS(NULL, NULL);
2399e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov
24006a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman   _EGL_FUNC_START(NULL, EGL_NONE, NULL, NULL);
24016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman
2402e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   ret = NULL;
2403e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   if (strncmp(procname, "egl", 3) == 0) {
2404e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      for (i = 0; egl_functions[i].name; i++) {
2405e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov         if (strcmp(egl_functions[i].name, procname) == 0) {
2406e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov            ret = egl_functions[i].function;
2407e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov            break;
2408e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov         }
2409e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      }
2410e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   }
2411e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   if (!ret)
2412e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov      ret = _eglGetDriverProc(procname);
2413e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov
2414e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov   RETURN_EGL_SUCCESS(NULL, ret);
2415e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov}
2416b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2417b6eda708431b91a3b568da0efac845c08cb36796Marek Olšákstatic int
2418b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák_eglLockDisplayInterop(EGLDisplay dpy, EGLContext context,
2419b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák                       _EGLDisplay **disp, _EGLDriver **drv,
2420b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák                       _EGLContext **ctx)
2421b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{
2422b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2423b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   *disp = _eglLockDisplay(dpy);
2424b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (!*disp || !(*disp)->Initialized || !(*disp)->Driver) {
2425b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      if (*disp)
2426b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák         _eglUnlockDisplay(*disp);
2427b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      return MESA_GLINTEROP_INVALID_DISPLAY;
2428b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   }
2429b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2430b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   *drv = (*disp)->Driver;
2431b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2432b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   *ctx = _eglLookupContext(context, *disp);
2433b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (!*ctx ||
2434b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák       ((*ctx)->ClientAPI != EGL_OPENGL_API &&
2435b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák        (*ctx)->ClientAPI != EGL_OPENGL_ES_API)) {
2436b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      _eglUnlockDisplay(*disp);
2437b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      return MESA_GLINTEROP_INVALID_CONTEXT;
2438b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   }
2439b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2440b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   return MESA_GLINTEROP_SUCCESS;
2441b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák}
2442b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2443ee39d4456e7551b257343551d59e7c6a3388fdc0Marek OlšákPUBLIC int
2444b6eda708431b91a3b568da0efac845c08cb36796Marek OlšákMesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context,
244513faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov                                struct mesa_glinterop_device_info *out)
2446b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{
2447b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLDisplay *disp;
2448b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLDriver *drv;
2449b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLContext *ctx;
2450b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   int ret;
2451b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2452b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx);
2453b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (ret != MESA_GLINTEROP_SUCCESS)
2454b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      return ret;
2455b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2456b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (drv->API.GLInteropQueryDeviceInfo)
2457b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      ret = drv->API.GLInteropQueryDeviceInfo(disp, ctx, out);
2458b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   else
2459b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      ret = MESA_GLINTEROP_UNSUPPORTED;
2460b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2461b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _eglUnlockDisplay(disp);
2462b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   return ret;
2463b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák}
2464b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2465ee39d4456e7551b257343551d59e7c6a3388fdc0Marek OlšákPUBLIC int
2466b6eda708431b91a3b568da0efac845c08cb36796Marek OlšákMesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context,
246713faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov                             struct mesa_glinterop_export_in *in,
246813faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov                             struct mesa_glinterop_export_out *out)
2469b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{
2470b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLDisplay *disp;
2471b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLDriver *drv;
2472b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _EGLContext *ctx;
2473b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   int ret;
2474b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2475b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx);
2476b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (ret != MESA_GLINTEROP_SUCCESS)
2477b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      return ret;
2478b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2479b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   if (drv->API.GLInteropExportObject)
2480b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      ret = drv->API.GLInteropExportObject(disp, ctx, in, out);
2481b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   else
2482b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák      ret = MESA_GLINTEROP_UNSUPPORTED;
2483b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák
2484b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   _eglUnlockDisplay(disp);
2485b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák   return ret;
2486b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák}
2487