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