eglapi.c revision f274dfaca4b53bae92dfe6a72c1890c381d84746
1adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
2adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Public EGL API entrypoints
3adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
4adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Generally, we use the EGLDisplay parameter as a key to lookup the
5adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * appropriate device driver handle, then jump though the driver's
6adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * dispatch table to handle the function.
7adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
8adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * That allows us the option of supporting multiple, simultaneous,
9adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * heterogeneous hardware devices in the future.
10adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
11adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * The EGLDisplay, EGLConfig, EGLContext and EGLSurface types are
12aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * opaque handles. Internal objects are linked to a display to
13aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * create the handles.
14adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
15aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * For each public API entry point, the opaque handles are looked up
16aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * before being dispatched to the drivers.  When it fails to look up
17aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * a handle, one of
18aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
19aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_DISPLAY
20aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_CONFIG
21aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_CONTEXT
22aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_SURFACE
23aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_SCREEN_MESA
24aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_MODE_MESA
25aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
26aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * is generated and the driver function is not called. An
27aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * uninitialized EGLDisplay has no driver associated with it. When
28aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * such display is detected,
29aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
30aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_NOT_INITIALIZED
31aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
32aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * is generated.
33adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
34bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * Some of the entry points use current display, context, or surface
35bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * implicitly.  For such entry points, the implicit objects are also
36bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * checked before calling the driver function.  Other than the
37bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * errors listed above,
38bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
39bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * EGL_BAD_CURRENT_SURFACE
40bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
41bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * may also be generated.
42bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
43adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Notes on naming conventions:
44adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
45adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * eglFooBar    - public EGL function
46adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_FOO_BAR  - public EGL token
47adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGLDatatype  - public EGL datatype
48adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
49adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _eglFooBar   - private EGL function
50adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _EGLDatatype - private EGL datatype, typedef'd struct
51adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _egl_struct  - private EGL struct, non-typedef'd
52adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
53adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
54adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
55adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
56adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <stdio.h>
57b2006a40eb22899d38cd31691640555228e36975Brian Paul#include <stdlib.h>
58adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <string.h>
591e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu
60adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h"
61adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h"
62adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
6394cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
64adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
65adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h"
682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h"
69a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h"
704eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#include "eglsync.h"
71adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
72adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
73adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
74f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint.
75655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu *
76655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * These macros will unlock the display and record the error code.
77f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
78bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_ERROR(disp, err, ret)        \
79bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                         \
80655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      if (disp)                                 \
81655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu         _eglUnlockDisplay(disp);               \
82f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      /* EGL error codes are non-zero */        \
83f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      if (err)                                  \
84f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu         _eglError(err, __FUNCTION__);          \
85bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      return ret;                               \
86bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
87bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
88bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_SUCCESS(disp, ret) \
89bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, EGL_SUCCESS, ret)
90bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
91b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu/* record EGL_SUCCESS only when ret evaluates to true */
92bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_EVAL(disp, ret) \
93bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, (ret) ? EGL_SUCCESS : 0, ret)
94f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
95f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
96bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu/*
97f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking.
98f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
99bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
100bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret, drv)         \
101bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                            \
102bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);  \
103bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                    \
104bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);           \
105bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
106bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
107bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret, drv)      \
108bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                                   \
109bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      drv = _eglCheck ## type(disp, obj, __FUNCTION__);   \
110bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                           \
111bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);                  \
112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
113bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
114bef4b476d729320599264483113d577ac5eeaff1Chia-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) \
121bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Config, conf, ret, drv)
122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
123bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SCREEN(disp, scrn, ret, drv) \
124bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Screen, scrn, ret, drv)
125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_MODE(disp, m, ret, drv) \
127bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Mode, m, ret, drv)
128bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
1294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#define _EGL_CHECK_SYNC(disp, s, ret, drv) \
1304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_OBJECT(disp, Sync, s, ret, drv)
131f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
132f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
133f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
134f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
135f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
136f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp) {
137f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
138f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
139f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
140f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp->Initialized) {
141f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
142f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
143f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
144f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return disp->Driver;
145f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
146f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
147f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
148f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
149f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
150f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
151f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
152f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
153f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
154f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!surf) {
155f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
156f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
157f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
160f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-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
1904eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#ifdef EGL_KHR_reusable_sync
1914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
1924eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
1934eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wustatic INLINE _EGLDriver *
1944eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu_eglCheckSync(_EGLDisplay *disp, _EGLSync *s, const char *msg)
1954eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
1964eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1974eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!drv)
1984eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
1994eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!s) {
2004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      _eglError(EGL_BAD_PARAMETER, msg);
2014eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2024eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   }
2034eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   return drv;
2044eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
2054eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2064eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2074eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#endif /* EGL_KHR_reusable_sync */
2084eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2094eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-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) {
220f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
221f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
222f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
223f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
224f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
225f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
226f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
227f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
228f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
229f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
230f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
231f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
232f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
233f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!m) {
234f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
235f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
236f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
237f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
238f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
239f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
240f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
241f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */
242f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
243f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
244f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
245655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display.
246655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
247655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE _EGLDisplay *
248655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display)
249655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
250655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *dpy = _eglLookupDisplay(display);
251655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (dpy)
252655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      _eglLockMutex(&dpy->Mutex);
253655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   return dpy;
254655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
255655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
256655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
257655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
258655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display.
259655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
260655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE void
261655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy)
262655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
263655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglUnlockMutex(&dpy->Mutex);
264655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
265655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
266655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
267655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
2686052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
269db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display.
270adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
2711ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
2724aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
273adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
274f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLPlatformType plat = _eglGetNativePlatform();
275f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay);
276721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
277adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
278adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
279adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2806052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
2816052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
2826052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
2836052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
2841ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
285adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
286adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
287655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
2887e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
2892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
290bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
292a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
293f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      if (!_eglMatchDriver(disp, EGL_FALSE))
294f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
2952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
296310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
297a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      disp->ClientAPIs &= _EGL_API_ALL_BITS;
298adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
2992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
3012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
302a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      *major = disp->VersionMajor;
303a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu      *minor = disp->VersionMinor;
3042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
306bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
307adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
308adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
309adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3101ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
311adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
312adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
313655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
316bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
3172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
318a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (disp->Initialized) {
319a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
320a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu
321ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
322a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      /* do not reset disp->Driver */
323a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_FALSE;
3242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
326bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3301ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
331adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
332adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
333655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
334aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
335b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
336aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
337bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, NULL, drv);
338b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryString(drv, disp, name);
339b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
340bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
341adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
342adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
343adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3441ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
3462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
347adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
348655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
349aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
350b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
351aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
352bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
353b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
354b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
355bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
356adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
358adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3591ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                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,
3692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
370b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
371bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
372adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
373adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
374adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3751ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
3772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
378adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
379655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
382b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
3832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
384bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv);
385b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
386b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
387bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
388adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
389adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
390adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
3922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
3932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
3942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
395655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
3982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
400b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4026b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv);
4036b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
4046b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!config) {
4056b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      /* config may be NULL if surfaceless */
4066b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (!disp->Extensions.KHR_surfaceless_gles1 &&
4076b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          !disp->Extensions.KHR_surfaceless_gles2 &&
4086b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          !disp->Extensions.KHR_surfaceless_opengl)
4096b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT);
4106b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   }
411b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg
412b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!share && share_list != EGL_NO_CONTEXT)
413bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
4142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
4164ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT;
417b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
418bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
419adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
420adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
421adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
423adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
424adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
425655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
426aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
427aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
428b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
429aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
430bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
4312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
432b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyContext(drv, disp, context);
433b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
434bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
435adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
436adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
437adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4381ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
4402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
441adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
442655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-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);
4462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
447b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
4482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
44917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
450bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
45117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
45217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
45317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
45417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
45517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
45617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
457bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
45817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
4592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
460bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(disp, EGL_TRUE);
46117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
4622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
463bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
4646b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!draw_surf || !read_surf) {
4656b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      /* surfaces may be NULL if surfaceless */
4666b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (!disp->Extensions.KHR_surfaceless_gles1 &&
4676b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          !disp->Extensions.KHR_surfaceless_gles2 &&
4686b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          !disp->Extensions.KHR_surfaceless_opengl)
4696b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
4706b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
4716b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if ((!draw_surf && draw != EGL_NO_SURFACE) ||
4726b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu          (!read_surf && read != EGL_NO_SURFACE))
4736b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
4746b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      if (draw_surf || read_surf)
4756b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE);
4766b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   }
4772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
478b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
479b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
480bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
481adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
482adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
483adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4841ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
4862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
487adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
488655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
489aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
490aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
491b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
492aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
493bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
494b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryContext(drv, disp, context, attribute, value);
495b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
496bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
497adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
498adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
499adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5001ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
5024aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativeWindowType window, const EGLint *attrib_list)
503adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
504655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
508b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
510bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
511f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
512f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
5132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
5154ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
516b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
517bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
518adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
519adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
520adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5211ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
5234aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
524adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
525655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
529b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
531bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
532f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
533f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
5342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
5364ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
537b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
538bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
539adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
540adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
541adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5421ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
5442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
545adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
546655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
550b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
552bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
5532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
5554ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
556b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
557bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
558adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
560adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5611ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
562adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
563adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
564655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
565aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
566aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
567b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
568aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
569bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
5702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
571b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroySurface(drv, disp, surf);
572b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
573bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
574adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
575adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
5782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
579adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
580655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
581aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
582aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
583b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
584aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
585bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
586b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
587b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
588bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
5932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
594adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
595655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
596aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
597aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
598b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
599aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
600bef4b476d729320599264483113d577ac5eeaff1Chia-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
606adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6071ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(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
621adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
623adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(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);
64157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
64257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
643aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
644b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
645aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
646bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
64757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
648d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
649d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       ctx->Resource.Display != disp)
650bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
65157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
65257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
653d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE)
654bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
65557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
656b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapInterval(drv, disp, surf, interval);
657b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
658bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
659adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
660adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
661adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6621ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
664adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
665bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
666655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
667aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
668aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
669b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
670aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
671bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
672bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
673bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
674d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
675d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
676bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
677b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
678b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapBuffers(drv, disp, surf);
679bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
680bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
681adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
682adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
683adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6841ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6854aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
686adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
687655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
688aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
689aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
690b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
691aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
692bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
693f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
694f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE);
695b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyBuffers(drv, disp, surf, target);
696b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
697bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
698adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
699adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
700adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7011ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7026c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void)
703adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7046c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7056c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
707b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7096c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
710bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
7112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
712ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
713655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
714655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
715655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   /* let bad current context imply bad current surface */
716d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
717d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
718bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
719b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
720b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
721a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
723b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitClient(drv, disp, ctx);
7246c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
725bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
7266c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
7276c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7296c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
7306c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
7316c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
7326c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2
7336c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
7346c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint api_index = t->CurrentAPIIndex;
7356c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
7366c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLBoolean ret;
7376c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7386c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (api_index != es_index && _eglIsCurrentThreadDummy())
739bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
7406c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7416c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = es_index;
7426c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   ret = eglWaitClient();
7436c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = api_index;
7446c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return ret;
7456c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else
7466c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return eglWaitClient();
7476c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif
748adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
749adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
750adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7511ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
752adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
753adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7546c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7556c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
757b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7596c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
760bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
761b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
762655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   disp = ctx->Resource.Display;
763655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
764655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
7656c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
766d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
767d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE)
768bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
769b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
770b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
771a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
773b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitNative(drv, disp, engine);
7742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
775bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
776adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
777adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
778adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7791ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
780adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
781adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
782a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
783b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLDisplay ret;
784b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
785b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
786b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
787bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
788adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
789adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
790adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
792adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
793adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
794adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
795b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
796b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
797b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetContextHandle(ctx);
798b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
799bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
800adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
801adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
802adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8031ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
804adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
805adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
80661906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
807b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLint err = EGL_SUCCESS;
80861906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
809b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
81061906631202af855d0742586956ff9f34522a525Chia-I Wu
81161906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
812bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
81361906631202af855d0742586956ff9f34522a525Chia-I Wu
81461906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
81561906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
81661906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
81761906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
81861906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
81961906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
82061906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
82161906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
82261906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
823b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      err = EGL_BAD_PARAMETER;
82461906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
82561906631202af855d0742586956ff9f34522a525Chia-I Wu   }
82661906631202af855d0742586956ff9f34522a525Chia-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{
83648822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
83748822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
83875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
83975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
840adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
841adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
842adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
843adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
84495f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY
84595f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname)
846adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8479061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
848adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
849adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
8509061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
851f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      /* core functions should not be queryable, but, well... */
852f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu#ifdef _EGL_GET_CORE_ADDRESSES
853f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      /* alphabetical order */
854f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglBindAPI", (_EGLProc) eglBindAPI },
855f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglBindTexImage", (_EGLProc) eglBindTexImage },
856f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglChooseConfig", (_EGLProc) eglChooseConfig },
857f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCopyBuffers", (_EGLProc) eglCopyBuffers },
858f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreateContext", (_EGLProc) eglCreateContext },
859f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePbufferFromClientBuffer", (_EGLProc) eglCreatePbufferFromClientBuffer },
860f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface },
861f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface },
862f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface },
863f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglDestroyContext", (_EGLProc) eglDestroyContext },
864f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglDestroySurface", (_EGLProc) eglDestroySurface },
865f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib },
866f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetConfigs", (_EGLProc) eglGetConfigs },
867f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext },
868f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay },
869f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface },
870f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetDisplay", (_EGLProc) eglGetDisplay },
871f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetError", (_EGLProc) eglGetError },
872f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglGetProcAddress", (_EGLProc) eglGetProcAddress },
873f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglInitialize", (_EGLProc) eglInitialize },
874f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglMakeCurrent", (_EGLProc) eglMakeCurrent },
875f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryAPI", (_EGLProc) eglQueryAPI },
876f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryContext", (_EGLProc) eglQueryContext },
877f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQueryString", (_EGLProc) eglQueryString },
878f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglQuerySurface", (_EGLProc) eglQuerySurface },
879f508c0c09702a5ea53dcb58721f3674605594c6eChia-I Wu      { "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage },
880f508c0c09702a5ea53dcb58721f3674605594c6eChia-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 */
889b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
8907012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
8917012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
8927012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
8931c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
8947012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
8957012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
89648822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
8977012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
8987012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
8997012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
9007012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
9017012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
902b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
90378d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
90478d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu      { "eglGetDRMDisplayMESA", (_EGLProc) eglGetDRMDisplayMESA },
90578d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif
906a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
907a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
908a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR },
909a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
91052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
91152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK },
91252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif
913b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#ifdef EGL_MESA_drm_image
914b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      { "eglCreateDRMImageMESA", (_EGLProc) eglCreateDRMImageMESA },
915b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg      { "eglExportDRMImageMESA", (_EGLProc) eglExportDRMImageMESA },
916b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#endif
917f274dfaca4b53bae92dfe6a72c1890c381d84746Kristian Høgsberg#ifdef EGL_WL_bind_wayland_display
9186b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      { "eglBindWaylandDisplayWL", (_EGLProc) eglBindWaylandDisplayWL },
9196b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      { "eglUnbindWaylandDisplayWL", (_EGLProc) eglUnbindWaylandDisplayWL },
9206b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#endif
921adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
922adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
923adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
924b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   _EGLProc ret;
9259061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
9269061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
927bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, NULL);
928b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
929b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = NULL;
9309061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
9319061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
932b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0) {
933b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            ret = egl_functions[i].function;
934b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            break;
935b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         }
936adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
937adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
938f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu   if (!ret)
939f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      ret = _eglGetDriverProc(procname);
940e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
941bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
942adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
943adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
944adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9459061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
9469061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
9479061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
948adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
949adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
950adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
951adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
953c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
954adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
955adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
956adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
957655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
958aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
959aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
960b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
961aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
962bef4b476d729320599264483113d577ac5eeaff1Chia-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
966bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
967adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
968adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
969adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9701ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
9722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
973adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
974655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
975aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
976aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
977b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
978aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
979bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
980b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
981b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
982bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
983adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
984adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
985adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9861ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
9882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
989adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
990655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
991aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
992aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
993b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
994aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
995bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, EGL_FALSE, drv);
996b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
997b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
998bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
999adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1000adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1001adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10021ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
10032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
10042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
10052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1006655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
10082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
10092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1010b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1012bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, source_context, EGL_FALSE, drv);
1013b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!dest_context)
1014bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
10152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1016b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyContextMESA(drv, disp,
1017b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         source_context, dest_context, mask);
1018b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1019bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10201c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
10211c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
10221c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
1023c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
10252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
1026adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1027655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1028aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1029b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1030aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1031bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
1032b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetScreensMESA(drv, disp, screens, max_screens, num_screens);
1033b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1034bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1035adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1036adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1037adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1038c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
10392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
10402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
1041adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1042655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
10442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1046b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
10472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1048bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
10492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
10502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
10514ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1052b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1053bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1054adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1055adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1056adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1057c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
10592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
1060adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1061655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
10642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
10652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1066b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1068bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
10692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
1070bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
10712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
1072bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_MODE_MESA, EGL_FALSE);
1073b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1074b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
10752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1076bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1077adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1078adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1079adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1080c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10817012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
1082adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1083655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1084aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1085aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1086b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1087aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1088bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1089b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
1090b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1091bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10927012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
10937012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10947012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1095c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
10972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
10987012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1099655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1100aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1101aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1102b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1103aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1104bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1105b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
1106b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1107bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1108adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1109adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1110adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1111c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
11132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
1114adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1115655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
11172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1119b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
11202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1121bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1122b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf);
1123b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && surface)
11242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
1125b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1127adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1128adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1129adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1130c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
11317012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
1132adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1133655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
11352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
1137b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
11382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1139bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1140b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenModeMESA(drv, disp, scrn, &m);
1141b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && mode)
11422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
11432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1144bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1145adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1146adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1147adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1148c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledconst char * EGLAPIENTRY
11497012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
11507012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1151655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1152aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
1153aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1154b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
1155aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1156bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, NULL, drv);
1157b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryModeStringMESA(drv, disp, m);
1158b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1159bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
11607012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
11617012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11627012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
11649061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
11659061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
116678d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
116778d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
116878d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WuEGLDisplay EGLAPIENTRY
116978d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WueglGetDRMDisplayMESA(int fd)
117078d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu{
117178d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(_EGL_PLATFORM_DRM, (void *) fd);
117278d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   return _eglGetDisplayHandle(dpy);
117378d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu}
117478d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
117578d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif /* EGL_MESA_drm_display */
117678d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
1177b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
1178b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
1179b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
1180b2006a40eb22899d38cd31691640555228e36975Brian Paul
1181b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
1182b2006a40eb22899d38cd31691640555228e36975Brian Paul
1183d5078b94323241a6482f54797756116b1c864327Brian Paul
1184d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1185d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
1186d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
1187d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
1188d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
1189d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
1190d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1191d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
1192d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
1193d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
1194d5078b94323241a6482f54797756116b1c864327Brian Paul */
1195c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1196b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
1197b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1198b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1199b2006a40eb22899d38cd31691640555228e36975Brian Paul
120075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
1201bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
120275da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
120321b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
1204bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
120521b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
1206310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
1207b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1208bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1209b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1210b2006a40eb22899d38cd31691640555228e36975Brian Paul
1211b2006a40eb22899d38cd31691640555228e36975Brian Paul
1212d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1213d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1214d5078b94323241a6482f54797756116b1c864327Brian Paul */
1215c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY
1216d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1217d5078b94323241a6482f54797756116b1c864327Brian Paul{
1218d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1219b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLenum ret;
1220b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1221b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
1222b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglConvertApiFromIndex(t->CurrentAPIIndex);
1223b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1224bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1225d5078b94323241a6482f54797756116b1c864327Brian Paul}
1226d5078b94323241a6482f54797756116b1c864327Brian Paul
1227d5078b94323241a6482f54797756116b1c864327Brian Paul
1228c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
1229b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1230b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1231b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1232b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1233655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
12342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
12352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
12362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1237b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
12382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1239bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
12402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
12412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
12422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
12434ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE;
1244b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1245bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1246b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1247b2006a40eb22899d38cd31691640555228e36975Brian Paul
1248b2006a40eb22899d38cd31691640555228e36975Brian Paul
1249c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1250b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1251b2006a40eb22899d38cd31691640555228e36975Brian Paul{
125211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
12532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
125411cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
125545ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      EGLint api_index = t->CurrentAPIIndex;
125611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      EGLint i;
125711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu
125811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      for (i = 0; i < _EGL_API_NUM_APIS; i++) {
125911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         _EGLContext *ctx = t->CurrentContexts[i];
126011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         if (ctx) {
126111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDisplay *disp = ctx->Resource.Display;
1262655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _EGLDriver *drv;
1263655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
126445ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu            t->CurrentAPIIndex = i;
1265655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
1266655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglLockMutex(&disp->Mutex);
1267655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            drv = disp->Driver;
126817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu            (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
1269655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglUnlockMutex(&disp->Mutex);
127011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         }
12712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
127245ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu
127345ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      t->CurrentAPIIndex = api_index;
1274b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
12752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
127675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1277b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1278bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1279b2006a40eb22899d38cd31691640555228e36975Brian Paul}
12807012d01d888d482f2c6ad1180231a482026d213aJon Smirl
12817012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1282b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
1283a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1284a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1285a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
1286a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1287a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1288c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLImageKHR EGLAPIENTRY
1289a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1290a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1291a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1292655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1293a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1294a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1295a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1296b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLImageKHR ret;
1297a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1298bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
12996b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
13006b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1301b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
1302bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1303a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1304a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1305a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
13064ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1307b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1308bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1309a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1310a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1311a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1312c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1313b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WueglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
1314a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1315655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1316a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1317a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1318b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1319a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1320bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
13216b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_image_base)
13226b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
1323a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1324bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1325a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1326a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1327b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyImageKHR(drv, disp, img);
1328b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1329bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1330a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1331a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1332a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1333a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
133452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
133552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
13364eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#ifdef EGL_KHR_reusable_sync
13374eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13384eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13394eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLSyncKHR EGLAPIENTRY
13404eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
13414eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13424eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13434eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13444eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *sync;
13454eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLSyncKHR ret;
13464eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
13486b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.KHR_reusable_sync)
13496b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_SYNC_KHR);
13504eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13514eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
13524ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR;
13534eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13554eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13564eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13574eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13584eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
13594eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
13604eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13614eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13624eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
13634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
13654eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13664eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13676b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.KHR_reusable_sync);
13686b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-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)
13784eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13794eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13804eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
13814eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13824eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLint ret;
13834eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13844eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13856b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-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);
13974eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13984eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
13994eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
14016b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-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;
14154eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
14164eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
14176b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-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
142752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
142852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
1429c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
143052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
143152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg			EGLint numRects, const EGLint *rects)
143252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{
143352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLContext *ctx = _eglGetCurrentContext();
143452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
143552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLSurface *surf = _eglLookupSurface(surface, disp);
143652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDriver *drv;
143752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   EGLBoolean ret;
143852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
143952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
144052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
14416b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.NOK_swap_region)
14426b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_FALSE);
14436b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
144452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   /* surface must be bound to current context in EGL 1.4 */
1445d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu   if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT ||
1446d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu       surf != ctx->DrawSurface)
144752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
144852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
14496b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
145052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
145152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
145252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg}
145352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
145452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif /* EGL_NOK_swap_region */
1455b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1456b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1457b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg#ifdef EGL_MESA_drm_image
1458b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1459b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergEGLImageKHR EGLAPIENTRY
1460b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list)
1461b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1462b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1463b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1464b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img;
1465b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   EGLImageKHR ret;
1466b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1467b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
14686b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   if (!disp->Extensions.MESA_drm_image)
14696b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu      RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR);
1470b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1471b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   img = drv->API.CreateDRMImageMESA(drv, disp, attr_list);
14724ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu   ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR;
1473b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1474b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
1475b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg}
1476b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1477b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergEGLBoolean EGLAPIENTRY
1478b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglExportDRMImageMESA(EGLDisplay dpy, EGLImageKHR image,
1479b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg		      EGLint *name, EGLint *handle, EGLint *stride)
1480b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{
1481b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
1482b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLImage *img = _eglLookupImage(image, disp);
1483b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGLDriver *drv;
1484b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   EGLBoolean ret;
1485b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg
1486b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
14876b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu   assert(disp->Extensions.MESA_drm_image);
14886b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu
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
14986b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
14996b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke#ifdef EGL_WL_bind_wayland_display
15006b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestruct wl_display;
15016b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15026b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeEGLBoolean EGLAPIENTRY
15036b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
15046b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
15056b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
15066b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
15076b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
15086b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15096b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
15106b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   assert(disp->Extensions.WL_bind_wayland_display);
15116b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15126b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   if (!display)
15136b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
15146b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15156b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   ret = drv->API.BindWaylandDisplayWL(drv, disp, display);
15166b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15176b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   RETURN_EGL_EVAL(disp, ret);
15186b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke}
15196b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15206b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeEGLBoolean EGLAPIENTRY
15216b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display)
15226b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
15236b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDisplay *disp = _eglLockDisplay(dpy);
15246b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _EGLDriver *drv;
15256b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   EGLBoolean ret;
15266b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke
15276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   _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
1538