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 Wustatic INLINE _EGLDriver *
2214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu_eglCheckSync(_EGLDisplay *disp, _EGLSync *s, const char *msg)
2224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
2234eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2244eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!drv)
2254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!s) {
2274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      _eglError(EGL_BAD_PARAMETER, msg);
2284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   }
2304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   return drv;
2314eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
2324eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2334eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
234f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#ifdef EGL_MESA_screen_surface
235f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
236f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
237f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
238f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
239f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
240f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
241f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
242f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
243f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!scrn) {
244f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
245f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
246f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
247f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
248f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
249f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
250f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
251f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
252f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
253f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
254f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
255f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
256f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
257f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!m) {
258f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
259f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
260f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
261f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
262f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
263f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
264f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
265f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */
266f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
267f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
268f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
269655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display.
270655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
271655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE _EGLDisplay *
272655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display)
273655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
274655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *dpy = _eglLookupDisplay(display);
275655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (dpy)
276655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      _eglLockMutex(&dpy->Mutex);
277655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   return dpy;
278655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
279655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
280655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
281655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
282655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display.
283655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
284655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE void
285655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy)
286655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
287655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglUnlockMutex(&dpy->Mutex);
288655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
289655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
290655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
291655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
2926052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
293db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display.
294adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
2951ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
2964aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
297adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
29885fe9484945cb57ffd49df248b0e5057eba6af04Benjamin Franzke   _EGLPlatformType plat = _eglGetNativePlatform(nativeDisplay);
299f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay);
300721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
301adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
302adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
303adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3046052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
3056052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
3066052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
3076052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
3081ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
309adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
310adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
311655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3127e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
3132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
314bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
3152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
316a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
317f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      if (!_eglMatchDriver(disp, EGL_FALSE))
318f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
3192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
320310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
321a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      disp->ClientAPIs &= _EGL_API_ALL_BITS;
322adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
3232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
3252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
326a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      *major = disp->VersionMajor;
327a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      *minor = disp->VersionMinor;
3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
330bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
331adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
332adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
333adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3341ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
335adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
336adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
337655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
340bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
3412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
342a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (disp->Initialized) {
343a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
344a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu
345ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
346a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      /* do not reset disp->Driver */
347a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_FALSE;
3482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
350bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
3512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
3522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3541ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
355adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
356adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
357655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
358aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
359b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
360aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
361bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, NULL, drv);
362b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryString(drv, disp, name);
363b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
364bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
365adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
366adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
367adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
3702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
371adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
372655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
373aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
374b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
375aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
376bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
377b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
378b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
379bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
380adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
381adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
382adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3831ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
386adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
387655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
388aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
389b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
390aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
391bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
392b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
394b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
395bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
396adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
397adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
398adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3991ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
402adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
403655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
406b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
4072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
408bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv);
409b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
410b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
411bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
412adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
413adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
414adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4151ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
4162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
4172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
4182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
419655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
4222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
424b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
4252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4266b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
4276b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
4286b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!config) {
4296b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      /* config may be NULL if surfaceless */
430b50703aea55450e04bcd8154335774786e0f253bIan Romanick      if (!disp->Extensions.KHR_surfaceless_context)
4316b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT);
4326b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   }
433b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg
434b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!share && share_list != EGL_NO_CONTEXT)
435bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
4362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
4384ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT;
439b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
440bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
441adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
442adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
443adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4441ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
445adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
446adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
447655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
448aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
449aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
450b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
451aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
452bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
4532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
454b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyContext(drv, disp, context);
455b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
456bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
457adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
458adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
459adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
4622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
463adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
464655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
4662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
4672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
4682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
469b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
4702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
47117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
472bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
47317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
47417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
47517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
47617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
47717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
47817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
479bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
48017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
4812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
482bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(disp, EGL_TRUE);
48317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
4842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
485bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
4866b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!draw_surf || !read_surf) {
4876b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      /* surfaces may be NULL if surfaceless */
488b50703aea55450e04bcd8154335774786e0f253bIan Romanick      if (!disp->Extensions.KHR_surfaceless_context)
4896b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
4906b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
4916b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if ((!draw_surf && draw != EGL_NO_SURFACE) ||
4926b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          (!read_surf && read != EGL_NO_SURFACE))
4936b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
4946b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (draw_surf || read_surf)
4956b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
4966b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   }
4972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
498b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
499b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
500bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
501adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
502adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
503adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5041ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
5062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
507adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
508655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
509aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
510aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
511b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
512aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
513bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
514b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryContext(drv, disp, context, attribute, value);
515b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
516bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
517adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
518adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
519adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5201ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
5224aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativeWindowType window, const EGLint *attrib_list)
523adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
524655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
528b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
530bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
53185fe9484945cb57ffd49df248b0e5057eba6af04Benjamin Franzke   if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay))
532f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
5332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
5354ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
536b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
537bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
538adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
539adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
540adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5411ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
5434aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
544adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
545655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
549b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
551bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
55285fe9484945cb57ffd49df248b0e5057eba6af04Benjamin Franzke   if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay))
553f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
5542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
5564ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
557b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
558bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
560adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
561adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5621ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
5642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
565adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
566655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
570b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
572bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
5732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
5754ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
576b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
577bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
578adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
579adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
580adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5811ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
582adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
583adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
584655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
585aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
586aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
587b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
588aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
589bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
5902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
591b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroySurface(drv, disp, surf);
592b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
593bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
594adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
595adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5961ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
5982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
599adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
600655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
601aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
602aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
603b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
604aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
605bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
606b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
607b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
608bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
610adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6111ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
6132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
614adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
615655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
616aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
617aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
618b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
619aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
620bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
621b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
622b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
623bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
624adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
625adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
626adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6271ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
628adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
629adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
630655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
631aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
632aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
633b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
634aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
635bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
636b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.BindTexImage(drv, disp, surf, buffer);
637b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
638bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
639adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
640adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
641adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6421ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
643adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
644adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
645655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
646aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
647aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
648b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
649aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
650bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
651b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer);
652b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
653bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
654adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
655adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
656adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6571ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
658adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
659adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
660655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
66157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
66257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
663aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
664b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
665aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
666bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
66757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
668d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
669d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       ctx->Resource.Display != disp)
670bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
67157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
67257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
673d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE)
674bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
67557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
676b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapInterval(drv, disp, surf, interval);
677b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
678bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
679adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
680adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
681adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6821ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
684adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
685bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
686655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
687aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
688aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
689b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
690aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
691bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
692bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
693bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
694d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
695d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
696bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
697b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
698b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapBuffers(drv, disp, surf);
699bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
700bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
701adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
702adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
703adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7041ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7054aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
706adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
707655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
708aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
709aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
710b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
711aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
712bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
71385fe9484945cb57ffd49df248b0e5057eba6af04Benjamin Franzke   if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay))
714f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE);
715b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyBuffers(drv, disp, surf, target);
716b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
717bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
718adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
719adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
720adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7211ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7226c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void)
723adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7246c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7256c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
727b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7296c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
730bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
7312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
732ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
733655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
734655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
735655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   /* let bad current context imply bad current surface */
736d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
737d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
738bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
739b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
740b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
741a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
743b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitClient(drv, disp, ctx);
7446c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
745bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
7466c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
7476c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7496c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
7506c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
7516c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
7526c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
7536c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint api_index = t->CurrentAPIIndex;
7546c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
7556c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLBoolean ret;
7566c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7576c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (api_index != es_index && _eglIsCurrentThreadDummy())
758bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
7596c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7606c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = es_index;
7616c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   ret = eglWaitClient();
7626c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = api_index;
7636c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return ret;
764adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
765adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
766adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7671ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
768adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
769adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7706c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7716c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
773b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7756c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
776bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
777b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
778655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   disp = ctx->Resource.Display;
779655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
780655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
7816c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
782d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
783d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
784bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
785b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
786b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
787a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
789b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitNative(drv, disp, engine);
7902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
791bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
792adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
793adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
794adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7951ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
796adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
797adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
798a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
799b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLDisplay ret;
800b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
801b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
802b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
803bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
804adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
805adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
806adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8071ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
808adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
809adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
811b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
812b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
813b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetContextHandle(ctx);
814b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
815bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
816adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
817adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
818adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8191ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
820adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
821adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
82261906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
823b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLint err = EGL_SUCCESS;
82461906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
825b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
82661906631202af855d0742586956ff9f34522a525Chia-I Wu
82761906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
828bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
82961906631202af855d0742586956ff9f34522a525Chia-I Wu
83061906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
83161906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
83261906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
83361906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
83461906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
83561906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
83661906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
83761906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
83861906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
839b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      err = EGL_BAD_PARAMETER;
84061906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
84161906631202af855d0742586956ff9f34522a525Chia-I Wu   }
84261906631202af855d0742586956ff9f34522a525Chia-I Wu
843b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetSurfaceHandle(surf);
844b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
845bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(NULL, err, ret);
846adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
847adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
848adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
850adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
851adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
85248822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
85348822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
85475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
85575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
856adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
857adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
858adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
859adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
86095f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY
86195f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname)
862adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
864adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
865adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
8669061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
867f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      /* core functions should not be queryable, but, well... */
868f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu#ifdef _EGL_GET_CORE_ADDRESSES
869f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      /* alphabetical order */
870f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglBindAPI", (_EGLProc) eglBindAPI },
871f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglBindTexImage", (_EGLProc) eglBindTexImage },
872f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglChooseConfig", (_EGLProc) eglChooseConfig },
873f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCopyBuffers", (_EGLProc) eglCopyBuffers },
874f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreateContext", (_EGLProc) eglCreateContext },
875f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePbufferFromClientBuffer", (_EGLProc) eglCreatePbufferFromClientBuffer },
876f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface },
877f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface },
878f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface },
879f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglDestroyContext", (_EGLProc) eglDestroyContext },
880f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglDestroySurface", (_EGLProc) eglDestroySurface },
881f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib },
882f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetConfigs", (_EGLProc) eglGetConfigs },
883f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext },
884f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay },
885f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface },
886f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetDisplay", (_EGLProc) eglGetDisplay },
887f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetError", (_EGLProc) eglGetError },
888f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetProcAddress", (_EGLProc) eglGetProcAddress },
889f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglInitialize", (_EGLProc) eglInitialize },
890f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglMakeCurrent", (_EGLProc) eglMakeCurrent },
891f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryAPI", (_EGLProc) eglQueryAPI },
892f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryContext", (_EGLProc) eglQueryContext },
893f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryString", (_EGLProc) eglQueryString },
894f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQuerySurface", (_EGLProc) eglQuerySurface },
895f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage },
896f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglReleaseThread", (_EGLProc) eglReleaseThread },
897f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglSurfaceAttrib", (_EGLProc) eglSurfaceAttrib },
898f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglSwapBuffers", (_EGLProc) eglSwapBuffers },
899f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglSwapInterval", (_EGLProc) eglSwapInterval },
900f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglTerminate", (_EGLProc) eglTerminate },
901f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglWaitClient", (_EGLProc) eglWaitClient },
902f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglWaitGL", (_EGLProc) eglWaitGL },
903f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglWaitNative", (_EGLProc) eglWaitNative },
904f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu#endif /* _EGL_GET_CORE_ADDRESSES */
905b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
9067012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
9077012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
9087012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
9091c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
9107012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
9117012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
91248822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
9137012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
9147012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
9157012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
9167012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
9177012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
918b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
91978d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
92078d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu      { "eglGetDRMDisplayMESA", (_EGLProc) eglGetDRMDisplayMESA },
92178d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif
922a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
923a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR },
924f63e129d5fef73b0710d294ddc19440d9d388836Chia-I Wu      { "eglCreateSyncKHR", (_EGLProc) eglCreateSyncKHR },
925f63e129d5fef73b0710d294ddc19440d9d388836Chia-I Wu      { "eglDestroySyncKHR", (_EGLProc) eglDestroySyncKHR },
926f63e129d5fef73b0710d294ddc19440d9d388836Chia-I Wu      { "eglClientWaitSyncKHR", (_EGLProc) eglClientWaitSyncKHR },
927f63e129d5fef73b0710d294ddc19440d9d388836Chia-I Wu      { "eglSignalSyncKHR", (_EGLProc) eglSignalSyncKHR },
928f63e129d5fef73b0710d294ddc19440d9d388836Chia-I Wu      { "eglGetSyncAttribKHR", (_EGLProc) eglGetSyncAttribKHR },
92952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
93052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK },
93152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif
932b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#ifdef EGL_MESA_drm_image
933b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      { "eglCreateDRMImageMESA", (_EGLProc) eglCreateDRMImageMESA },
934b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      { "eglExportDRMImageMESA", (_EGLProc) eglExportDRMImageMESA },
935b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#endif
936f274dfaca4b53bae92dfe6a72c1890c381d84746Kristian Høgsberg#ifdef EGL_WL_bind_wayland_display
9376b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      { "eglBindWaylandDisplayWL", (_EGLProc) eglBindWaylandDisplayWL },
9386b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      { "eglUnbindWaylandDisplayWL", (_EGLProc) eglUnbindWaylandDisplayWL },
939e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg      { "eglQueryWaylandBufferWL", (_EGLProc) eglQueryWaylandBufferWL },
9406b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif
9417d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund      { "eglPostSubBufferNV", (_EGLProc) eglPostSubBufferNV },
942adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
943adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
944adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
945b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   _EGLProc ret;
9469061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
9479061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
948bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, NULL);
949b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
950b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = NULL;
9519061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
9529061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
953b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0) {
954b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            ret = egl_functions[i].function;
955b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            break;
956b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         }
957adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
958adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
959f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu   if (!ret)
960f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      ret = _eglGetDriverProc(procname);
961e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
962bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
963adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
964adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
965adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9669061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
9679061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
9689061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
969adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
970adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
971adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
972adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9731ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
974c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
975adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
976adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
977adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
978655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
979aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
980aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
981b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
982aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
983bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
984b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
985b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         modes, modes_size, num_modes);
986b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
987bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
988adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
989adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
990adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
9932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
994adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
995655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
996aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
997aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
998b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
999aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1000bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1001b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
1002b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1003bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1004adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1005adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1006adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10071ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
10082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
10092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
1010adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1011655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1012aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
1013aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1014b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1015aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1016bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, EGL_FALSE, drv);
1017b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
1018b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1019bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1020adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1021adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1022adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10231ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
10242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
10252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
10262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1027655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
10292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
10302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1031b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1033bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, source_context, EGL_FALSE, drv);
1034b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!dest_context)
1035bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
10362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1037b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyContextMESA(drv, disp,
1038b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         source_context, dest_context, mask);
1039b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1040bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10411c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
10421c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
10431c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
1044c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
10462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
1047adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1048655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1049aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1050b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1051aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1052bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
1053b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetScreensMESA(drv, disp, screens, max_screens, num_screens);
1054b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1055bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1056adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1057adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1058adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1059c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
10602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
10612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
1062adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1063655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
10652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1067b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
10682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1069bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
10702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
10712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
10724ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1073b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1074bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1075adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1076adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1077adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1078c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
10802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
1081adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1082655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
10852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
10862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1087b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1089bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
10902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
1091bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
10922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
1093bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_MODE_MESA, EGL_FALSE);
1094b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1095b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
10962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1097bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1098adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1099adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1100adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1101c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11027012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
1103adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1104655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1105aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1106aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1107b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1108aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1109bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1110b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
1111b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
11137012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
11147012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11157012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1116c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
11182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
11197012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1120655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1121aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1122aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1123b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1124aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1126b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
1127b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1128bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1129adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1130adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1131adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1132c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
11342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
1135adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1136655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
11382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1140b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
11412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1142bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1143b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf);
1144b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && surface)
11452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
1146b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1147bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1148adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1149adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1150adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1151c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11527012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
1153adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1154655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
11562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
1158b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
11592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1160bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1161b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenModeMESA(drv, disp, scrn, &m);
1162b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && mode)
11632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
11642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1165bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1166adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1167adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1168adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1169c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledconst char * EGLAPIENTRY
11707012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
11717012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1172655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1173aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
1174aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1175b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
1176aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1177bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, NULL, drv);
1178b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryModeStringMESA(drv, disp, m);
1179b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1180bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
11817012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
11827012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11837012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11849061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
11859061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
11869061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
118778d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
118878d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
118978d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WuEGLDisplay EGLAPIENTRY
119078d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WueglGetDRMDisplayMESA(int fd)
119178d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu{
11926a661895e946f38b21775bf9cb45ef6b22fab85aJosé Fonseca   _EGLDisplay *dpy = _eglFindDisplay(_EGL_PLATFORM_DRM, (void *) (intptr_t) fd);
119378d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   return _eglGetDisplayHandle(dpy);
119478d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu}
119578d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
119678d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif /* EGL_MESA_drm_display */
119778d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
1198b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
1199b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
1200b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
1201b2006a40eb22899d38cd31691640555228e36975Brian Paul
1202d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1203d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
1204d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
1205d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
1206d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
1207d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
1208d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1209d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
1210d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
1211d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
1212d5078b94323241a6482f54797756116b1c864327Brian Paul */
1213c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1214b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
1215b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1216b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1217b2006a40eb22899d38cd31691640555228e36975Brian Paul
121875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
1219bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
122075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
122121b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
1222bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
122321b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
1224310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
1225b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1226bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1227b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1228b2006a40eb22899d38cd31691640555228e36975Brian Paul
1229b2006a40eb22899d38cd31691640555228e36975Brian Paul
1230d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1231d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1232d5078b94323241a6482f54797756116b1c864327Brian Paul */
1233c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY
1234d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1235d5078b94323241a6482f54797756116b1c864327Brian Paul{
1236d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1237b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLenum ret;
1238b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1239b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
1240b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglConvertApiFromIndex(t->CurrentAPIIndex);
1241b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1242bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1243d5078b94323241a6482f54797756116b1c864327Brian Paul}
1244d5078b94323241a6482f54797756116b1c864327Brian Paul
1245d5078b94323241a6482f54797756116b1c864327Brian Paul
1246c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
1247b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1248b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1249b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1250b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1251655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
12522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
12532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
12542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1255b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
12562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1257bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
12582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
12592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
12602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
12614ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1262b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1263bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1264b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1265b2006a40eb22899d38cd31691640555228e36975Brian Paul
1266b2006a40eb22899d38cd31691640555228e36975Brian Paul
1267c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1268b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1269b2006a40eb22899d38cd31691640555228e36975Brian Paul{
127011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
12712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
127211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
127345ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      EGLint api_index = t->CurrentAPIIndex;
127411cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      EGLint i;
127511cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu
127611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      for (i = 0; i < _EGL_API_NUM_APIS; i++) {
127711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         _EGLContext *ctx = t->CurrentContexts[i];
127811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         if (ctx) {
127911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDisplay *disp = ctx->Resource.Display;
1280655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _EGLDriver *drv;
1281655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
128245ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu            t->CurrentAPIIndex = i;
1283655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
1284655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglLockMutex(&disp->Mutex);
1285655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            drv = disp->Driver;
128617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu            (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
1287655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglUnlockMutex(&disp->Mutex);
128811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         }
12892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
129045ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu
129145ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      t->CurrentAPIIndex = api_index;
1292b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
12932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
129475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1295b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1296bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1297b2006a40eb22899d38cd31691640555228e36975Brian Paul}
12987012d01d888d482f2c6ad1180231a482026d213aJon Smirl
12997012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1300c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLImageKHR EGLAPIENTRY
1301a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1302a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1303a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1304655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1305a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1306a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1307a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1308b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLImageKHR ret;
1309a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1310bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
13116b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
13126b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1313b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
1314bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1315a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1316a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1317a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
13184ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1319b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1320bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1321a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1322a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1323a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1324c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1325b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WueglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
1326a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1327655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1328a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1329a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1330b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1331a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1332bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
13336b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
13346b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
1335a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1336bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1337a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1338a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1339b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyImageKHR(drv, disp, img);
1340b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1341bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1342a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1343a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1344a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
13454eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLSyncKHR EGLAPIENTRY
13464eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
13474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13484eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13494eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13504eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *sync;
13514eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLSyncKHR ret;
13524eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13534eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
13546b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_reusable_sync)
13556b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_SYNC_KHR);
13564eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13574eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
13584ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
13594eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13604eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13614eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13624eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
13654eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
13664eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13674eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13684eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
13694eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13704eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
13714eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13724eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13736b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
13746b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
13754eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _eglUnlinkSync(s);
13764eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.DestroySyncKHR(drv, disp, s);
13774eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13784eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13794eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13804eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13814eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13824eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLint EGLAPIENTRY
13834eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
13844eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13854eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13864eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
13874eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13884eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLint ret;
13894eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13904eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13916b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
13924eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout);
13934eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13944eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13954eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13964eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13974eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13984eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
13994eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
14004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
14014eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
14024eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
14034eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
14044eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
14054eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14064eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
14076b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
14084eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.SignalSyncKHR(drv, disp, s, mode);
14094eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14104eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
14114eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
14124eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14134eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14144eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
14154eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
14164eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
14174eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
14184eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
14194eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
14204eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
14214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
14236b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
14244eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.GetSyncAttribKHR(drv, disp, s, attribute, value);
14254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
14274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
14284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
143052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
143152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
1432c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
143352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
143452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg			EGLint numRects, const EGLint *rects)
143552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{
143652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLContext *ctx = _eglGetCurrentContext();
143752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
143852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLSurface *surf = _eglLookupSurface(surface, disp);
143952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDriver *drv;
144052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   EGLBoolean ret;
144152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
144252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
144352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
14446b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.NOK_swap_region)
14456b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
14466b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
144752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   /* surface must be bound to current context in EGL 1.4 */
1448d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1449d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
145052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
145152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
14526b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
145352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
145452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
145552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg}
145652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
145752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif /* EGL_NOK_swap_region */
1458b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1459b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1460b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#ifdef EGL_MESA_drm_image
1461b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1462b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergEGLImageKHR EGLAPIENTRY
1463b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
1464b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1465b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1466b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1467b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img;
1468b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   EGLImageKHR ret;
1469b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1470b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
14716b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.MESA_drm_image)
14726b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1473b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1474b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
14754ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1476b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1477b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1478b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1479b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1480b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergEGLBoolean EGLAPIENTRY
1481b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglExportDRMImageMESA(EGLDisplay dpy, EGLImageKHR image,
1482b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg		      EGLint *name, EGLint *handle, EGLint *stride)
1483b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1484b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1485b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img = _eglLookupImage(image, disp);
1486b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1487b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   EGLBoolean ret;
1488b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1489b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
14906b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.MESA_drm_image);
14916b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
1492b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   if (!img)
1493b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1494b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1495b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   ret = drv->API.ExportDRMImageMESA(drv, disp, img, name, handle, stride);
1496b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1497b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1498b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1499b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1500b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#endif
15016b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15026b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#ifdef EGL_WL_bind_wayland_display
15036b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestruct wl_display;
15046b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15056b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeEGLBoolean EGLAPIENTRY
15066b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
15076b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
15086b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
15096b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
15106b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
15116b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15126b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
15136b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
15146b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15156b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
15166b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
15176b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15186b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.BindWaylandDisplayWL(drv, disp, display);
15196b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15206b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
15216b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
15226b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15236b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeEGLBoolean EGLAPIENTRY
15246b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
15256b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
15266b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
15276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
15286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
15296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15306b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
15316b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
15326b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15336b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
15346b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
15356b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15366b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.UnbindWaylandDisplayWL(drv, disp, display);
15376b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15386b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
15396b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
1540e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1541e6a33570b73aa56c87818d7f67a122d4427b7841Kristian HøgsbergEGLBoolean EGLAPIENTRY
1542e6a33570b73aa56c87818d7f67a122d4427b7841Kristian HøgsbergeglQueryWaylandBufferWL(EGLDisplay dpy,struct wl_buffer *buffer,
1543e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg                        EGLint attribute, EGLint *value)
1544e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg{
1545e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1546e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGLDriver *drv;
1547e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   EGLBoolean ret;
1548e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1549e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
1550e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   assert(disp->Extensions.WL_bind_wayland_display);
1551e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1552e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   if (!buffer)
1553e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1554e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1555e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   ret = drv->API.QueryWaylandBufferWL(drv, disp, buffer, attribute, value);
1556e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg
1557e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1558e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg}
15596b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif
15607d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
15617d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
15627d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik HöglundEGLBoolean EGLAPIENTRY
15637d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik HöglundeglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface,
15647d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund                   EGLint x, EGLint y, EGLint width, EGLint height)
15657d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund{
15667d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLDisplay *disp = _eglLockDisplay(dpy);
15677d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLSurface *surf = _eglLookupSurface(surface, disp);
15687d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGLDriver *drv;
15697d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   EGLBoolean ret;
15707d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
15717d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
15727d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
15737d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   if (!disp->Extensions.NV_post_sub_buffer)
15747d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund      RETURN_EGL_EVAL(disp, EGL_FALSE);
15757d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
15767d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   ret = drv->API.PostSubBufferNV(drv, disp, surf, x, y, width, height);
15777d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund
15787d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund   RETURN_EGL_EVAL(disp, ret);
15797d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund}
1580