eglapi.c revision f2001df508fda599a18b3586d2775e970a3db13a
1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/**************************************************************************
2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu *
3f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
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>
891e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu
90adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h"
91adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h"
92adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
9394cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
94adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
95adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h"
982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h"
99a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h"
1004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#include "eglsync.h"
101adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
102adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
103adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
104f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint.
105655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu *
106655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * These macros will unlock the display and record the error code.
107f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
108bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_ERROR(disp, err, ret)        \
109bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                         \
110655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      if (disp)                                 \
111655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu         _eglUnlockDisplay(disp);               \
112f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      /* EGL error codes are non-zero */        \
113f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      if (err)                                  \
114f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu         _eglError(err, __FUNCTION__);          \
115bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      return ret;                               \
116bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
117bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
118bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_SUCCESS(disp, ret) \
119bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, EGL_SUCCESS, ret)
120bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
121b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu/* record EGL_SUCCESS only when ret evaluates to true */
122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_EVAL(disp, ret) \
123bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, (ret) ? EGL_SUCCESS : 0, ret)
124f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
125f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu/*
127f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking.
128f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
129bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
130bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret, drv)         \
131bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                            \
132bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);  \
133bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                    \
134bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);           \
135bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
136bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
137bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret, drv)      \
138bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                                   \
139bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      drv = _eglCheck ## type(disp, obj, __FUNCTION__);   \
140bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                           \
141bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);                  \
142bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
143bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
144bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SURFACE(disp, surf, ret, drv) \
145bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Surface, surf, ret, drv)
146bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
147bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONTEXT(disp, context, ret, drv) \
148bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Context, context, ret, drv)
149bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
150bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONFIG(disp, conf, ret, drv) \
151bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Config, conf, ret, drv)
152bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
153bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SCREEN(disp, scrn, ret, drv) \
154bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Screen, scrn, ret, drv)
155bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
156bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_MODE(disp, m, ret, drv) \
157bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Mode, m, ret, drv)
158bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
1594eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#define _EGL_CHECK_SYNC(disp, s, ret, drv) \
1604eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_OBJECT(disp, Sync, s, ret, drv)
161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp) {
167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp->Initialized) {
171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return disp->Driver;
175f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
177f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
178f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
179f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
180f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
181f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
183f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
184f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!surf) {
185f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
186f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
187f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
188f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
189f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
191f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
192f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
193f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
194f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
195f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
196f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
197f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
198f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!context) {
199f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
200f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
201f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
202f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
203f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
204f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
205f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
206f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
207f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
208f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
209f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
210f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
211f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
212f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!conf) {
213f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
214f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
215f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
216f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
217f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
218f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
219f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
2204eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#ifdef EGL_KHR_reusable_sync
2214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2234eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wustatic INLINE _EGLDriver *
2244eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu_eglCheckSync(_EGLDisplay *disp, _EGLSync *s, const char *msg)
2254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
2264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!drv)
2284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!s) {
2304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      _eglError(EGL_BAD_PARAMETER, msg);
2314eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2324eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   }
2334eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   return drv;
2344eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
2354eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2364eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2374eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#endif /* EGL_KHR_reusable_sync */
2384eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2394eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
240f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#ifdef EGL_MESA_screen_surface
241f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
242f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
243f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
244f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
245f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
246f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
247f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
248f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
249f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!scrn) {
250f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
251f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
252f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
253f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
254f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
255f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
256f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
257f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
258f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
259f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
260f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
261f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
262f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
263f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!m) {
264f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
265f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
266f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
267f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
268f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
269f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
270f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
271f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */
272f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
273f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
274f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
275655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display.
276655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
277655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE _EGLDisplay *
278655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display)
279655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
280655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *dpy = _eglLookupDisplay(display);
281655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (dpy)
282655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      _eglLockMutex(&dpy->Mutex);
283655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   return dpy;
284655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
285655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
286655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
287655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
288655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display.
289655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
290655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE void
291655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy)
292655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
293655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglUnlockMutex(&dpy->Mutex);
294655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
295655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
296655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
297655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
2986052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
299db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display.
300adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
3011ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
3024aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
303adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
304f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLPlatformType plat = _eglGetNativePlatform();
305f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay);
306721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
307adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
308adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
309adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3106052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
3116052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
3126052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
3136052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
3141ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
315adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
316adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
317655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3187e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
3192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
320bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
3212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
322a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
323f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      if (!_eglMatchDriver(disp, EGL_FALSE))
324f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
3252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
326310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
327a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      disp->ClientAPIs &= _EGL_API_ALL_BITS;
328adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
3292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
3312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
332a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      *major = disp->VersionMajor;
333a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      *minor = disp->VersionMinor;
3342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
336bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
337adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
338adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
339adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3401ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
341adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
342adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
343655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
346bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
3472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
348a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (disp->Initialized) {
349a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
350a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu
351ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
352a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      /* do not reset disp->Driver */
353a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_FALSE;
3542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
356bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
3572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
3582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
361adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
362adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
363655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
364aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
365b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
366aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
367bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, NULL, drv);
368b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryString(drv, disp, name);
369b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
370bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
371adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
372adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
373adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3741ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
3762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
378655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
379aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
380b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
381aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
382bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
383b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
384b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
385bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
386adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
387adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
388adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3891ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
392adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
393655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
394aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
395b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
396aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
397bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
398b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
400b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
401bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
402adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
403adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
404adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4051ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
4072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
408adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
409655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
412b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
4132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
414bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv);
415b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
416b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
417bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
419adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
420adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4211ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
4222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
4242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
425655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
4282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
430b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
4312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4326b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
4336b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
4346b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!config) {
4356b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      /* config may be NULL if surfaceless */
4366b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (!disp->Extensions.KHR_surfaceless_gles1 &&
4376b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          !disp->Extensions.KHR_surfaceless_gles2 &&
4386b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          !disp->Extensions.KHR_surfaceless_opengl)
4396b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT);
4406b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   }
441b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg
442b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!share && share_list != EGL_NO_CONTEXT)
443bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
4442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
4464ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT;
447b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
448bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
449adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
450adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
451adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
453adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
454adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
455655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
456aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
457aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
458b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
459aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
460bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
4612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
462b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyContext(drv, disp, context);
463b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
464bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
465adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
466adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
467adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
4702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
471adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
472655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
4742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
4752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
4762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
477b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
4782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
47917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
480bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
48117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
48217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
48317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
48417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
48517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
48617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
487bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
48817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
4892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
490bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(disp, EGL_TRUE);
49117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
4922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
493bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
4946b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!draw_surf || !read_surf) {
4956b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      /* surfaces may be NULL if surfaceless */
4966b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (!disp->Extensions.KHR_surfaceless_gles1 &&
4976b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          !disp->Extensions.KHR_surfaceless_gles2 &&
4986b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          !disp->Extensions.KHR_surfaceless_opengl)
4996b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
5006b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
5016b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if ((!draw_surf && draw != EGL_NO_SURFACE) ||
5026b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          (!read_surf && read != EGL_NO_SURFACE))
5036b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
5046b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (draw_surf || read_surf)
5056b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
5066b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   }
5072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
508b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
509b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
510bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
511adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
512adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
513adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5141ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
5162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
517adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
518655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
519aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
520aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
521b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
522aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
523bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
524b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryContext(drv, disp, context, attribute, value);
525b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
526bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
527adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
528adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
529adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5301ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
5324aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativeWindowType window, const EGLint *attrib_list)
533adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
534655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
538b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
540bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
541f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
542f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
5432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
5454ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
546b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
547bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
548adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
549adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
550adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5511ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
5534aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
554adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
555655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
559b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
561bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
562f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
563f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
5642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
5664ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
567b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
568bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
569adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
570adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
571adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5721ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
5742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
575adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
576655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
580b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
582bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
5832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
5854ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
586b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
587bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
588adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
592adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
593adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
594655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
595aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
596aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
597b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
598aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
599bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
6002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
601b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroySurface(drv, disp, surf);
602b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
603bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
604adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
605adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6061ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
6082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
610655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
611aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
612aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
613b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
614aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
615bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
616b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
617b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
618bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
619adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
620adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6211ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
6232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
624adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
625655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
626aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
627aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
628b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
629aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
630bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
631b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
632b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
633bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
634adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
635adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
636adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6371ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
638adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
639adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
640655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
641aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
642aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
643b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
644aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
645bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
646b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.BindTexImage(drv, disp, surf, buffer);
647b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
648bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
649adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
650adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
651adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
653adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
654adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
655655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
656aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
657aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
658b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
659aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
660bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
661b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer);
662b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
663bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
664adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
665adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
666adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6671ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
668adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
669adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
670655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
67157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
67257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
673aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
674b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
675aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
676bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
67757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
678d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
679d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       ctx->Resource.Display != disp)
680bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
68157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
68257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
683d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE)
684bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
68557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
686b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapInterval(drv, disp, surf, interval);
687b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
688bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
689adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
690adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
691adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6921ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
694adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
695bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
696655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
697aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
698aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
699b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
700aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
701bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
702bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
703bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
704d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
705d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
706bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
707b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
708b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapBuffers(drv, disp, surf);
709bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
710bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
711adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
712adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
713adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7141ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7154aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
716adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
717655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
718aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
719aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
720b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
721aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
722bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
723f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
724f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE);
725b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyBuffers(drv, disp, surf, target);
726b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
727bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
728adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
729adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
730adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7311ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7326c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void)
733adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7346c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7356c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
737b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7396c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
740bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
7412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
742ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
743655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
744655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
745655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   /* let bad current context imply bad current surface */
746d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
747d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
748bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
749b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
750b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
751a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
753b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitClient(drv, disp, ctx);
7546c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
755bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
7566c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
7576c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7596c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
7606c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
7616c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
7626c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2
7636c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
7646c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint api_index = t->CurrentAPIIndex;
7656c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
7666c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLBoolean ret;
7676c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7686c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (api_index != es_index && _eglIsCurrentThreadDummy())
769bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
7706c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7716c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = es_index;
7726c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   ret = eglWaitClient();
7736c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = api_index;
7746c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return ret;
7756c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else
7766c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return eglWaitClient();
7776c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif
778adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
779adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
780adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7811ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
782adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
783adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7846c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7856c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
787b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7896c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
790bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
791b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
792655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   disp = ctx->Resource.Display;
793655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
794655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
7956c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
796d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
797d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
798bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
799b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
800b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
801a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
8022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
803b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitNative(drv, disp, engine);
8042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
805bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
806adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
807adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
808adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8091ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
811adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
812a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
813b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLDisplay ret;
814b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
815b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
816b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
817bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
818adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
819adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
820adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8211ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
822adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
823adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
824adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
825b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
826b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
827b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetContextHandle(ctx);
828b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
829bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
830adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
831adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
832adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8331ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
834adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
835adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
83661906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
837b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLint err = EGL_SUCCESS;
83861906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
839b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
84061906631202af855d0742586956ff9f34522a525Chia-I Wu
84161906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
842bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
84361906631202af855d0742586956ff9f34522a525Chia-I Wu
84461906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
84561906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
84661906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
84761906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
84861906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
84961906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
85061906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
85161906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
85261906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
853b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      err = EGL_BAD_PARAMETER;
85461906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
85561906631202af855d0742586956ff9f34522a525Chia-I Wu   }
85661906631202af855d0742586956ff9f34522a525Chia-I Wu
857b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetSurfaceHandle(surf);
858b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
859bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(NULL, err, ret);
860adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
861adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
862adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
864adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
865adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
86648822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
86748822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
86875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
86975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
870adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
871adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
872adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
873adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
87495f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY
87595f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname)
876adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8779061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
878adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
879adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
8809061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
881f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      /* core functions should not be queryable, but, well... */
882f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu#ifdef _EGL_GET_CORE_ADDRESSES
883f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      /* alphabetical order */
884f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglBindAPI", (_EGLProc) eglBindAPI },
885f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglBindTexImage", (_EGLProc) eglBindTexImage },
886f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglChooseConfig", (_EGLProc) eglChooseConfig },
887f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCopyBuffers", (_EGLProc) eglCopyBuffers },
888f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreateContext", (_EGLProc) eglCreateContext },
889f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePbufferFromClientBuffer", (_EGLProc) eglCreatePbufferFromClientBuffer },
890f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface },
891f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface },
892f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface },
893f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglDestroyContext", (_EGLProc) eglDestroyContext },
894f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglDestroySurface", (_EGLProc) eglDestroySurface },
895f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib },
896f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetConfigs", (_EGLProc) eglGetConfigs },
897f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext },
898f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay },
899f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface },
900f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetDisplay", (_EGLProc) eglGetDisplay },
901f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetError", (_EGLProc) eglGetError },
902f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetProcAddress", (_EGLProc) eglGetProcAddress },
903f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglInitialize", (_EGLProc) eglInitialize },
904f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglMakeCurrent", (_EGLProc) eglMakeCurrent },
905f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryAPI", (_EGLProc) eglQueryAPI },
906f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryContext", (_EGLProc) eglQueryContext },
907f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryString", (_EGLProc) eglQueryString },
908f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQuerySurface", (_EGLProc) eglQuerySurface },
909f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage },
910f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglReleaseThread", (_EGLProc) eglReleaseThread },
911f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglSurfaceAttrib", (_EGLProc) eglSurfaceAttrib },
912f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglSwapBuffers", (_EGLProc) eglSwapBuffers },
913f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglSwapInterval", (_EGLProc) eglSwapInterval },
914f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglTerminate", (_EGLProc) eglTerminate },
915f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglWaitClient", (_EGLProc) eglWaitClient },
916f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglWaitGL", (_EGLProc) eglWaitGL },
917f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglWaitNative", (_EGLProc) eglWaitNative },
918f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu#endif /* _EGL_GET_CORE_ADDRESSES */
919b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
9207012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
9217012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
9227012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
9231c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
9247012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
9257012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
92648822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
9277012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
9287012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
9297012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
9307012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
9317012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
932b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
93378d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
93478d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu      { "eglGetDRMDisplayMESA", (_EGLProc) eglGetDRMDisplayMESA },
93578d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif
936a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
937a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
938a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR },
939a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
94052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
94152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK },
94252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif
943b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#ifdef EGL_MESA_drm_image
944b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      { "eglCreateDRMImageMESA", (_EGLProc) eglCreateDRMImageMESA },
945b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      { "eglExportDRMImageMESA", (_EGLProc) eglExportDRMImageMESA },
946b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#endif
947f274dfaca4b53bae92dfe6a72c1890c381d84746Kristian Høgsberg#ifdef EGL_WL_bind_wayland_display
9486b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      { "eglBindWaylandDisplayWL", (_EGLProc) eglBindWaylandDisplayWL },
9496b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      { "eglUnbindWaylandDisplayWL", (_EGLProc) eglUnbindWaylandDisplayWL },
9506b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif
951adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
952adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
953adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
954b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   _EGLProc ret;
9559061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
9569061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
957bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, NULL);
958b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
959b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = NULL;
9609061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
9619061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
962b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0) {
963b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            ret = egl_functions[i].function;
964b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            break;
965b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         }
966adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
967adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
968f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu   if (!ret)
969f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      ret = _eglGetDriverProc(procname);
970e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
971bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
972adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
973adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
974adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9759061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
9769061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
9779061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
978adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
979adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
980adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
981adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9821ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
983c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
984adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
985adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
986adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
987655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
988aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
989aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
990b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
991aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
992bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
993b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
994b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         modes, modes_size, num_modes);
995b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
996bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
997adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
998adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
999adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10001ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
10012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
10022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
1003adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1004655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1005aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1006aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1007b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1008aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1009bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1010b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
1011b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1012bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1013adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1014adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1015adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10161ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
10172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
10182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
1019adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1020655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1021aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
1022aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1023b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1024aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1025bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, EGL_FALSE, drv);
1026b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
1027b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1028bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1029adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1030adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1031adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10321ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
10332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
10342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
10352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1036655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
10382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
10392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1040b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1042bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, source_context, EGL_FALSE, drv);
1043b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!dest_context)
1044bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
10452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1046b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyContextMESA(drv, disp,
1047b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         source_context, dest_context, mask);
1048b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1049bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10501c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
10511c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
10521c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
1053c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
10552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
1056adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1057655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1058aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1059b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1060aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1061bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
1062b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetScreensMESA(drv, disp, screens, max_screens, num_screens);
1063b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1064bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1065adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1066adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1067adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1068c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
10692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
10702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
1071adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1072655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
10742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1076b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
10772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1078bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
10792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
10802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
10814ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1082b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1083bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1084adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1085adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1086adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1087c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
10892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
1090adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1091655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
10942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
10952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1096b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1098bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
10992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
1100bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
11012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
1102bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_MODE_MESA, EGL_FALSE);
1103b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1104b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
11052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1106bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1107adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1108adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1109adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1110c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11117012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
1112adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1113655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1114aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1115aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1116b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1117aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1118bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1119b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
1120b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1121bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
11227012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
11237012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11247012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1125c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
11272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
11287012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1129655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1130aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1131aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1132b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1133aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1134bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1135b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
1136b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1137bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1138adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1139adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1140adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1141c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
11432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
1144adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1145655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
11472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1149b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
11502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1151bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1152b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf);
1153b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && surface)
11542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
1155b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1156bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1157adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1158adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1159adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1160c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11617012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
1162adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1163655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
11652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
1167b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
11682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1169bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1170b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenModeMESA(drv, disp, scrn, &m);
1171b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && mode)
11722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
11732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1174bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1175adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1176adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1177adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1178c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledconst char * EGLAPIENTRY
11797012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
11807012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1181655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1182aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
1183aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1184b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
1185aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1186bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, NULL, drv);
1187b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryModeStringMESA(drv, disp, m);
1188b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1189bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
11907012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
11917012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11927012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11939061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
11949061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
11959061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
119678d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
119778d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
119878d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WuEGLDisplay EGLAPIENTRY
119978d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WueglGetDRMDisplayMESA(int fd)
120078d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu{
12016a661895e946f38b21775bf9cb45ef6b22fab85aJosé Fonseca   _EGLDisplay *dpy = _eglFindDisplay(_EGL_PLATFORM_DRM, (void *) (intptr_t) fd);
120278d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   return _eglGetDisplayHandle(dpy);
120378d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu}
120478d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
120578d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif /* EGL_MESA_drm_display */
120678d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
1207b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
1208b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
1209b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
1210b2006a40eb22899d38cd31691640555228e36975Brian Paul
1211b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
1212b2006a40eb22899d38cd31691640555228e36975Brian Paul
1213d5078b94323241a6482f54797756116b1c864327Brian Paul
1214d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1215d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
1216d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
1217d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
1218d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
1219d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
1220d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1221d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
1222d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
1223d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
1224d5078b94323241a6482f54797756116b1c864327Brian Paul */
1225c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1226b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
1227b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1228b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1229b2006a40eb22899d38cd31691640555228e36975Brian Paul
123075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
1231bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
123275da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
123321b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
1234bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
123521b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
1236310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
1237b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1238bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1239b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1240b2006a40eb22899d38cd31691640555228e36975Brian Paul
1241b2006a40eb22899d38cd31691640555228e36975Brian Paul
1242d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1243d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1244d5078b94323241a6482f54797756116b1c864327Brian Paul */
1245c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY
1246d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1247d5078b94323241a6482f54797756116b1c864327Brian Paul{
1248d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1249b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLenum ret;
1250b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1251b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
1252b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglConvertApiFromIndex(t->CurrentAPIIndex);
1253b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1254bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1255d5078b94323241a6482f54797756116b1c864327Brian Paul}
1256d5078b94323241a6482f54797756116b1c864327Brian Paul
1257d5078b94323241a6482f54797756116b1c864327Brian Paul
1258c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
1259b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1260b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1261b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1262b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1263655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
12642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
12652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
12662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1267b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
12682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1269bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
12702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
12712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
12722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
12734ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1274b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1275bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1276b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1277b2006a40eb22899d38cd31691640555228e36975Brian Paul
1278b2006a40eb22899d38cd31691640555228e36975Brian Paul
1279c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1280b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1281b2006a40eb22899d38cd31691640555228e36975Brian Paul{
128211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
12832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
128411cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
128545ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      EGLint api_index = t->CurrentAPIIndex;
128611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      EGLint i;
128711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu
128811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      for (i = 0; i < _EGL_API_NUM_APIS; i++) {
128911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         _EGLContext *ctx = t->CurrentContexts[i];
129011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         if (ctx) {
129111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDisplay *disp = ctx->Resource.Display;
1292655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _EGLDriver *drv;
1293655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
129445ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu            t->CurrentAPIIndex = i;
1295655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
1296655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglLockMutex(&disp->Mutex);
1297655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            drv = disp->Driver;
129817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu            (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
1299655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglUnlockMutex(&disp->Mutex);
130011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         }
13012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
130245ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu
130345ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      t->CurrentAPIIndex = api_index;
1304b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
13052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
130675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1307b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1308bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1309b2006a40eb22899d38cd31691640555228e36975Brian Paul}
13107012d01d888d482f2c6ad1180231a482026d213aJon Smirl
13117012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1312b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
1313a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1314a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1315a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
1316a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1317a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1318c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLImageKHR EGLAPIENTRY
1319a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1320a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1321a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1322655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1323a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1324a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1325a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1326b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLImageKHR ret;
1327a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1328bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
13296b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
13306b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1331b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
1332bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1333a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1334a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1335a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
13364ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1337b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1338bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1339a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1340a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1341a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1342c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1343b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WueglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
1344a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1345655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1346a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1347a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1348b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1349a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1350bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
13516b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
13526b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
1353a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1354bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1355a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1356a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1357b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyImageKHR(drv, disp, img);
1358b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1359bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1360a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1361a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1362a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1363a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
136452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
136552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
13664eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#ifdef EGL_KHR_reusable_sync
13674eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13684eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13694eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLSyncKHR EGLAPIENTRY
13704eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
13714eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13724eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13734eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13744eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *sync;
13754eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLSyncKHR ret;
13764eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13774eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
13786b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_reusable_sync)
13796b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_SYNC_KHR);
13804eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13814eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
13824ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
13834eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13844eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13854eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13864eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13874eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13884eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
13894eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
13904eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13924eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
13934eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13944eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
13954eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13964eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13976b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
13986b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
13994eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _eglUnlinkSync(s);
14004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.DestroySyncKHR(drv, disp, s);
14014eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14024eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
14034eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
14044eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14054eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14064eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLint EGLAPIENTRY
14074eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
14084eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
14094eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
14104eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
14114eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
14124eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLint ret;
14134eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14144eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
14156b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
14164eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout);
14174eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14184eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
14194eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
14204eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
14234eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
14244eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
14254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
14264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
14274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
14284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
14294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
14316b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
14324eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.SignalSyncKHR(drv, disp, s, mode);
14334eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14344eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
14354eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
14364eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14374eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14384eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
14394eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
14404eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
14414eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
14424eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
14434eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
14444eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
14454eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14464eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
14476b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
14484eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.GetSyncAttribKHR(drv, disp, s, attribute, value);
14494eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14504eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
14514eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
14524eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14534eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#endif /* EGL_KHR_reusable_sync */
14554eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14564eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
145752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
145852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
1459c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
146052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
146152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg			EGLint numRects, const EGLint *rects)
146252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{
146352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLContext *ctx = _eglGetCurrentContext();
146452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
146552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLSurface *surf = _eglLookupSurface(surface, disp);
146652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDriver *drv;
146752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   EGLBoolean ret;
146852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
146952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
147052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
14716b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.NOK_swap_region)
14726b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
14736b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
147452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   /* surface must be bound to current context in EGL 1.4 */
1475d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1476d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
147752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
147852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
14796b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
148052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
148152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
148252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg}
148352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
148452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif /* EGL_NOK_swap_region */
1485b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1486b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1487b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#ifdef EGL_MESA_drm_image
1488b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1489b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergEGLImageKHR EGLAPIENTRY
1490b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
1491b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1492b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1493b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1494b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img;
1495b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   EGLImageKHR ret;
1496b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1497b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
14986b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.MESA_drm_image)
14996b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1500b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1501b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
15024ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1503b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1504b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1505b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1506b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1507b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergEGLBoolean EGLAPIENTRY
1508b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglExportDRMImageMESA(EGLDisplay dpy, EGLImageKHR image,
1509b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg		      EGLint *name, EGLint *handle, EGLint *stride)
1510b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1511b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1512b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img = _eglLookupImage(image, disp);
1513b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1514b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   EGLBoolean ret;
1515b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1516b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
15176b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.MESA_drm_image);
15186b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
1519b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   if (!img)
1520b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1521b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1522b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   ret = drv->API.ExportDRMImageMESA(drv, disp, img, name, handle, stride);
1523b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1524b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1525b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1526b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1527b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#endif
15286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#ifdef EGL_WL_bind_wayland_display
15306b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestruct wl_display;
15316b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15326b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeEGLBoolean EGLAPIENTRY
15336b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
15346b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
15356b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
15366b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
15376b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
15386b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15396b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
15406b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
15416b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15426b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
15436b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
15446b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15456b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.BindWaylandDisplayWL(drv, disp, display);
15466b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15476b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
15486b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
15496b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15506b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeEGLBoolean EGLAPIENTRY
15516b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
15526b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
15536b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
15546b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
15556b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
15566b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15576b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
15586b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
15596b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15606b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
15616b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
15626b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15636b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.UnbindWaylandDisplayWL(drv, disp, display);
15646b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15656b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
15666b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
15676b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif
1568