eglapi.c revision 4eebea74a81ec5fbacf2347ea88cac137ddd4d69
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
601e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu#include "eglstring.h"
61adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h"
62adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h"
63adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
6494cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
65adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
66adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h"
692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h"
70a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h"
714eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#include "eglsync.h"
72adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
73adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
74adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
75f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint.
76655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu *
77655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * These macros will unlock the display and record the error code.
78f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
79bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_ERROR(disp, err, ret)        \
80bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                         \
81655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      if (disp)                                 \
82655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu         _eglUnlockDisplay(disp);               \
83f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      /* EGL error codes are non-zero */        \
84f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      if (err)                                  \
85f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu         _eglError(err, __FUNCTION__);          \
86bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      return ret;                               \
87bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
88bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
89bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_SUCCESS(disp, ret) \
90bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, EGL_SUCCESS, ret)
91bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
92b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu/* record EGL_SUCCESS only when ret evaluates to true */
93bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_EVAL(disp, ret) \
94bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, (ret) ? EGL_SUCCESS : 0, ret)
95f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
96f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
97bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu/*
98f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking.
99f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
100bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
101bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret, drv)         \
102bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                            \
103bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);  \
104bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                    \
105bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);           \
106bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
107bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
108bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret, drv)      \
109bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                                   \
110bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      drv = _eglCheck ## type(disp, obj, __FUNCTION__);   \
111bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                           \
112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);                  \
113bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
114bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
115bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SURFACE(disp, surf, ret, drv) \
116bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Surface, surf, ret, drv)
117bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
118bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONTEXT(disp, context, ret, drv) \
119bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Context, context, ret, drv)
120bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
121bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONFIG(disp, conf, ret, drv) \
122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Config, conf, ret, drv)
123bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
124bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SCREEN(disp, scrn, ret, drv) \
125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Screen, scrn, ret, drv)
126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
127bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_MODE(disp, m, ret, drv) \
128bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Mode, m, ret, drv)
129bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
1304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#define _EGL_CHECK_SYNC(disp, s, ret, drv) \
1314eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_OBJECT(disp, Sync, s, ret, drv)
132f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
133f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
134f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
135f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
136f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
137f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp) {
138f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
139f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
140f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
141f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp->Initialized) {
142f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
143f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
144f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
145f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return disp->Driver;
146f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
147f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
148f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
149f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
150f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
151f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
152f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
153f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
154f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
155f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!surf) {
156f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
157f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
160f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!context) {
170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
175f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
177f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
178f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
179f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
180f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
181f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
183f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!conf) {
184f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
185f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
186f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
187f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
188f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
189f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
1914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#ifdef EGL_KHR_reusable_sync
1924eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
1934eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
1944eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wustatic INLINE _EGLDriver *
1954eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu_eglCheckSync(_EGLDisplay *disp, _EGLSync *s, const char *msg)
1964eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
1974eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1984eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!drv)
1994eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   if (!s) {
2014eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      _eglError(EGL_BAD_PARAMETER, msg);
2024eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu      return NULL;
2034eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   }
2044eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   return drv;
2054eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
2064eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2074eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2084eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#endif /* EGL_KHR_reusable_sync */
2094eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
2104eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
211f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#ifdef EGL_MESA_screen_surface
212f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
213f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
214f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
215f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
216f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
217f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
218f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
219f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
220f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!scrn) {
221f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
222f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
223f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
224f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
225f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
226f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
227f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
228f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
229f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
230f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
231f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
232f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
233f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
234f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!m) {
235f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
236f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
237f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
238f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
239f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
240f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
241f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
242f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */
243f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
244f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
245f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
246655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display.
247655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
248655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE _EGLDisplay *
249655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display)
250655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
251655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *dpy = _eglLookupDisplay(display);
252655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (dpy)
253655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      _eglLockMutex(&dpy->Mutex);
254655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   return dpy;
255655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
256655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
257655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
258655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
259655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display.
260655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
261655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE void
262655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy)
263655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
264655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglUnlockMutex(&dpy->Mutex);
265655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
266655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
267655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
268655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
2696052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
270db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display.
271adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
2721ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
2734aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
274adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
275f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLPlatformType plat = _eglGetNativePlatform();
276f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay);
277721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
278adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
279adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
280adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2816052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
2826052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
2836052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
2846052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
2851ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
286adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
287adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
288655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
2897e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
2902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
291bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
293a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
294f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      if (!_eglMatchDriver(disp, EGL_FALSE))
295f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
2962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
297f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      _eglsnprintf(disp->Version, sizeof(disp->Version), "%d.%d (%s)",
298f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu            disp->APImajor, disp->APIminor, disp->Driver->Name);
299310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
300310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      disp->ClientAPIsMask &= _EGL_API_ALL_BITS;
301adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
3022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
3042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
305f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      *major = disp->APImajor;
306f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      *minor = disp->APIminor;
3072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
309bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
310adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
311adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
312adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
314adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
315adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
316655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
319bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
3202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
321a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (disp->Initialized) {
322a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
323a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu
324ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
325a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      /* do not reset disp->Driver */
326a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_FALSE;
3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
329bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
3302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
3312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3331ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
334adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
335adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
336655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
337aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
338b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
339aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
340bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, NULL, drv);
341b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryString(drv, disp, name);
342b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
343bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
344adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
345adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
346adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3471ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
3492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
351655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
352aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
353b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
354aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
355bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
356b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
357b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
358bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
359adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
360adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
361adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3621ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
365adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
366655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
367aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
368b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
369aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
370bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
371b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
373b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
374bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
375adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
376adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3781ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
3802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
381adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
382655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
385b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
3862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
387bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv);
388b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
389b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
390bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
391adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
392adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
393adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3941ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
3952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
398655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
403b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
4042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
405b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   if (config)
406b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg      _EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT, drv);
407b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   else
408b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg      drv = _eglCheckDisplay(disp, __FUNCTION__);
409b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg
410b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!share && share_list != EGL_NO_CONTEXT)
411bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
4122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
414b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (context) ? _eglLinkContext(context, disp) : EGL_NO_CONTEXT;
415b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
416bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
419adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4201ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
421adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
422adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
423655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
424aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
425aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
426b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
427aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
428bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
4292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
430b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyContext(drv, disp, context);
431b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
432bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
433adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
434adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
435adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4361ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
4382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
439adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
440655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
4422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
4432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
4442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
445b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
4462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
44717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
448bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
44917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
45017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
45117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
45217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
45317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
45417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
455bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
45617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
4572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
458bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(disp, EGL_TRUE);
45917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
4602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
461bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
4622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((!draw_surf && draw != EGL_NO_SURFACE) ||
4632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu       (!read_surf && read != EGL_NO_SURFACE))
464bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
4652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
466b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
467b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
468bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
469adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
470adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
471adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4721ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
4742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
475adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
476655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
477aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
478aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
479b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
480aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
481bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
482b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryContext(drv, disp, context, attribute, value);
483b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
484bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
485adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
486adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
487adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4881ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
4904aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativeWindowType window, const EGLint *attrib_list)
491adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
492655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
496b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
4972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
498bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
499f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
500f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
5012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
503b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
504b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
505bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
506adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
507adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
508adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5091ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
5114aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
512adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
513655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
517b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
519bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
520f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
521f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
5222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
524b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
525b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
526bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
527adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
528adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
529adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5301ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
5322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
533adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
534655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
538b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
540bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
5412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
543b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
544b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
545bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
546adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
547adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
548adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
550adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
551adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
552655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
553aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
554aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
555b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
556aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
557bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
5582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
559b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroySurface(drv, disp, surf);
560b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
561bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
562adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
563adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
5662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
567adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
568655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
569aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
570aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
571b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
572aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
573bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
574b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
575b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
576bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
577adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
578adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5791ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
5812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
582adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
583655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
584aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
585aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
586b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
587aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
588bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
589b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
590b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
591bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
592adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
593adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
594adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5951ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
596adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
597adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
598655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
599aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
600aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
601b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
602aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
603bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
604b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.BindTexImage(drv, disp, surf, buffer);
605b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
606bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
607adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6101ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
611adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
612adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
613655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
614aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
615aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
616b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
617aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
618bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
619b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer);
620b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
621bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
622adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
623adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
624adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6251ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
626adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
627adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
628655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
62957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
63057da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
631aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
632b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
633aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
634bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
63557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
636ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || ctx->Resource.Display != disp)
637bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
63857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
63957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
64057da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   if (!_eglIsSurfaceLinked(surf))
641bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
64257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
643b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapInterval(drv, disp, surf, interval);
644b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
645bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
646adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
647adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
648adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
651adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
652bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
653655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
654aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
655aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
656b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
657aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
658bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
659bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
660bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
661bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
662bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
663b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
664b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapBuffers(drv, disp, surf);
665bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
666bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
667adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
668adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
669adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6701ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6714aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
672adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
673655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
674aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
675aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
676b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
677aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
678bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
679f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
680f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE);
681b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyBuffers(drv, disp, surf, target);
682b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
683bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
684adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
685adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
686adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6871ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6886c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void)
689adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6906c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
6916c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
6922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
693b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
6942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6956c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
696bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
6972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
698ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
699655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
700655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
701655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   /* let bad current context imply bad current surface */
702655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
703bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
704b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
705b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
706a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
708b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitClient(drv, disp, ctx);
7096c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
710bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
7116c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
7126c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7146c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
7156c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
7166c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
7176c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2
7186c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
7196c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint api_index = t->CurrentAPIIndex;
7206c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
7216c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLBoolean ret;
7226c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7236c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (api_index != es_index && _eglIsCurrentThreadDummy())
724bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
7256c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7266c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = es_index;
7276c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   ret = eglWaitClient();
7286c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = api_index;
7296c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return ret;
7306c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else
7316c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return eglWaitClient();
7326c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif
733adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
734adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
735adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7361ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
737adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
738adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7396c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7406c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
742b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7446c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
745bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
746b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
747655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   disp = ctx->Resource.Display;
748655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
749655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
7506c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
7516c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
752bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
753b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
754b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
755a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
757b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitNative(drv, disp, engine);
7582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
759bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
762adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
764adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
765adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
766a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
767b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLDisplay ret;
768b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
769b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
770b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
771bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
772adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
773adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
774adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7751ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
776adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
777adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
778adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
779b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
780b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
781b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetContextHandle(ctx);
782b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
783bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
784adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
785adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
786adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7871ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
788adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
789adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
79061906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
791b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLint err = EGL_SUCCESS;
79261906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
793b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
79461906631202af855d0742586956ff9f34522a525Chia-I Wu
79561906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
796bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
79761906631202af855d0742586956ff9f34522a525Chia-I Wu
79861906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
79961906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
80061906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
80161906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
80261906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
80361906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
80461906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
80561906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
80661906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
807b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      err = EGL_BAD_PARAMETER;
80861906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
80961906631202af855d0742586956ff9f34522a525Chia-I Wu   }
81061906631202af855d0742586956ff9f34522a525Chia-I Wu
811b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetSurfaceHandle(surf);
812b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
813bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(NULL, err, ret);
814adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
815adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
816adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8171ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
818adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
819adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
82048822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
82148822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
82275da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
82375da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
824adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
825adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
826adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
827adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
82895f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY
82995f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname)
830adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8319061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
832adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
833adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
8349061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
8359061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      /* extensions only */
836b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
8377012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
8387012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
8397012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
8401c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
8417012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
8427012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
84348822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
8447012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
8457012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
8467012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
8477012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
8487012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
849b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
85078d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
85178d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu      { "eglGetDRMDisplayMESA", (_EGLProc) eglGetDRMDisplayMESA },
85278d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif
853a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
854a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
855a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR },
856a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
85752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
85852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK },
85952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif
860adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
861adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
862adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
863b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   _EGLProc ret;
8649061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
8659061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
866bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, NULL);
867b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
868b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = NULL;
8699061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
8709061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
871b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0) {
872b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            ret = egl_functions[i].function;
873b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            break;
874b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         }
875adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
876adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
877f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu   if (!ret)
878f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      ret = _eglGetDriverProc(procname);
879e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
880bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
881adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
882adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
883adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8849061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
8859061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
8869061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
887adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
888adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
889adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
890adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
892c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
893adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
894adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
895adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
896655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
897aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
898aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
899b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
900aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
901bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
902b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
903b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         modes, modes_size, num_modes);
904b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
905bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
906adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
907adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
908adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9091ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
9112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
912adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
913655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
914aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
915aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
916b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
917aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
918bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
919b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
920b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
921bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
922adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
923adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
924adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9251ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
9272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
928adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
929655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
930aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
931aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
932b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
933aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
934bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, EGL_FALSE, drv);
935b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
936b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
937bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
938adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
939adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
940adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9411ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
9432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
9442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
945655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
9462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
9472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
9482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
949b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
9502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
951bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, source_context, EGL_FALSE, drv);
952b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!dest_context)
953bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
9542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
955b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyContextMESA(drv, disp,
956b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         source_context, dest_context, mask);
957b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
958bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
9591c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
9601c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
9611c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
962c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
9632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
9642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
965adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
966655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
967aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
968b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
969aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
970bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
971b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetScreensMESA(drv, disp, screens, max_screens, num_screens);
972b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
973bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
974adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
975adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
976adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
977c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
9782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
9792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
980adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
981655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
9822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
9832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
985b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
9862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
987bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
9882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
990b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
991b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
992bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
993adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
994adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
995adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
996c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
9972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
9982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
999adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1000655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
10032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
10042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1005b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1007bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
10082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
1009bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
10102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
1011bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_MODE_MESA, EGL_FALSE);
1012b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1013b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
10142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1015bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1016adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1017adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1018adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1019c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10207012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
1021adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1022655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1023aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1024aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1025b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1026aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1027bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1028b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
1029b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1030bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10317012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
10327012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10337012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1034c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
10362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
10377012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1038655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1039aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1040aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1041b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1042aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1043bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1044b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
1045b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1046bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1047adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1048adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1049adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1050c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
10522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
1053adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1054655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1058b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1060bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1061b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf);
1062b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && surface)
10632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
1064b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1065bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1066adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1067adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1068adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1069c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10707012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
1071adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1072655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
1076b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1078bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1079b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenModeMESA(drv, disp, scrn, &m);
1080b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && mode)
10812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
10822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1083bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1084adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1085adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1086adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1087c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledconst char * EGLAPIENTRY
10887012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
10897012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1090655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1091aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
1092aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1093b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
1094aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1095bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, NULL, drv);
1096b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryModeStringMESA(drv, disp, m);
1097b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1098bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10997012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
11007012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11017012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11029061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
11039061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
11049061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
110578d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
110678d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
110778d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WuEGLDisplay EGLAPIENTRY
110878d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WueglGetDRMDisplayMESA(int fd)
110978d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu{
111078d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(_EGL_PLATFORM_DRM, (void *) fd);
111178d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   return _eglGetDisplayHandle(dpy);
111278d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu}
111378d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
111478d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif /* EGL_MESA_drm_display */
111578d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
1116b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
1117b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
1118b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
1119b2006a40eb22899d38cd31691640555228e36975Brian Paul
1120b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
1121b2006a40eb22899d38cd31691640555228e36975Brian Paul
1122d5078b94323241a6482f54797756116b1c864327Brian Paul
1123d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1124d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
1125d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
1126d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
1127d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
1128d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
1129d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1130d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
1131d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
1132d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
1133d5078b94323241a6482f54797756116b1c864327Brian Paul */
1134c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1135b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
1136b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1137b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1138b2006a40eb22899d38cd31691640555228e36975Brian Paul
113975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
1140bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
114175da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
114221b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
1143bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
114421b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
1145310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
1146b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1147bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1148b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1149b2006a40eb22899d38cd31691640555228e36975Brian Paul
1150b2006a40eb22899d38cd31691640555228e36975Brian Paul
1151d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1152d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1153d5078b94323241a6482f54797756116b1c864327Brian Paul */
1154c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY
1155d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1156d5078b94323241a6482f54797756116b1c864327Brian Paul{
1157d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1158b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLenum ret;
1159b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1160b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
1161b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglConvertApiFromIndex(t->CurrentAPIIndex);
1162b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1163bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1164d5078b94323241a6482f54797756116b1c864327Brian Paul}
1165d5078b94323241a6482f54797756116b1c864327Brian Paul
1166d5078b94323241a6482f54797756116b1c864327Brian Paul
1167c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
1168b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1169b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1170b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1171b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1172655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
11742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1176b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
11772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1178bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
11792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
11802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
11812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
1182b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
1183b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1184bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1185b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1186b2006a40eb22899d38cd31691640555228e36975Brian Paul
1187b2006a40eb22899d38cd31691640555228e36975Brian Paul
1188c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1189b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1190b2006a40eb22899d38cd31691640555228e36975Brian Paul{
119111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
11922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
119311cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
119445ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      EGLint api_index = t->CurrentAPIIndex;
119511cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      EGLint i;
119611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu
119711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      for (i = 0; i < _EGL_API_NUM_APIS; i++) {
119811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         _EGLContext *ctx = t->CurrentContexts[i];
119911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         if (ctx) {
120011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDisplay *disp = ctx->Resource.Display;
1201655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _EGLDriver *drv;
1202655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
120345ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu            t->CurrentAPIIndex = i;
1204655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
1205655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglLockMutex(&disp->Mutex);
1206655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            drv = disp->Driver;
120717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu            (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
1208655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglUnlockMutex(&disp->Mutex);
120911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         }
12102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
121145ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu
121245ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      t->CurrentAPIIndex = api_index;
1213b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
12142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
121575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1216b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1217bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1218b2006a40eb22899d38cd31691640555228e36975Brian Paul}
12197012d01d888d482f2c6ad1180231a482026d213aJon Smirl
12207012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1221b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
1222a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1223a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1224a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
1225a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1226a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1227c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLImageKHR EGLAPIENTRY
1228a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1229a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1230a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1231655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1232a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1233a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1234a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1235b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLImageKHR ret;
1236a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1237bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
1238b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
1239bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1240a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1241a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1242a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
1243b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR;
1244b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1245bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1246a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1247a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1248a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1249c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1250b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WueglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
1251a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1252655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1253a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1254a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1255b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1256a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1257bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
1258a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1259bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1260a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1261a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1262b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyImageKHR(drv, disp, img);
1263b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1264bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1265a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1266a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1267a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1268a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
126952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
127052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
12714eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#ifdef EGL_KHR_reusable_sync
12724eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
12734eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
12744eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLSyncKHR EGLAPIENTRY
12754eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
12764eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
12774eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
12784eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
12794eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *sync;
12804eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLSyncKHR ret;
12814eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
12824eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv);
12834eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
12844eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list);
12854eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = (sync) ? _eglLinkSync(sync, disp) : EGL_NO_SYNC_KHR;
12864eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
12874eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
12884eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
12894eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
12904eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
12914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
12924eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
12934eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
12944eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
12954eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
12964eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
12974eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
12984eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
12994eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _eglUnlinkSync(s);
13014eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.DestroySyncKHR(drv, disp, s);
13024eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13034eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13044eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13054eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13064eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13074eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLint EGLAPIENTRY
13084eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
13094eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13104eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13114eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
13124eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13134eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLint ret;
13144eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13154eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13164eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout);
13174eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13184eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13194eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13204eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
13234eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode)
13244eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
13274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
13294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13314eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.SignalSyncKHR(drv, disp, s, mode);
13324eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13334eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13344eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13354eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13364eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13374eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WuEGLBoolean EGLAPIENTRY
13384eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I WueglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
13394eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{
13404eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
13414eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLSync *s = _eglLookupSync(sync, disp);
13424eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGLDriver *drv;
13434eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   EGLBoolean ret;
13444eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13454eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv);
13464eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   ret = drv->API.GetSyncAttribKHR(drv, disp, s, attribute, value);
13474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13484eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
13494eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu}
13504eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13514eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13524eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#endif /* EGL_KHR_reusable_sync */
13534eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
13544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
135552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
135652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
1357c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
135852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
135952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg			EGLint numRects, const EGLint *rects)
136052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{
136152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLContext *ctx = _eglGetCurrentContext();
136252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
136352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLSurface *surf = _eglLookupSurface(surface, disp);
136452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDriver *drv;
136552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   EGLBoolean ret;
136652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
136752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
136852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
136952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   /* surface must be bound to current context in EGL 1.4 */
137052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
137152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
137252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
137352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   if (drv->API.SwapBuffersRegionNOK)
137452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
137552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   else
137652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      ret = drv->API.SwapBuffers(drv, disp, surf);
137752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
137852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
137952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg}
138052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
138152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif /* EGL_NOK_swap_region */
1382