eglapi.c revision f22665df95406567193dee0089f4830664ff4101
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"
64adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglglobals.h"
6594cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
66adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
67adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h"
702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h"
71a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.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
130f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
131f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
132f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
133f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
134f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
135f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp) {
136f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
137f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
138f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
139f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp->Initialized) {
140f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
141f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
142f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
143f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return disp->Driver;
144f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
145f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
146f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
147f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
148f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
149f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
150f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
151f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
152f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
153f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!surf) {
154f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
155f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
156f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
157f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
160f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!context) {
168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
175f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
177f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
178f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
179f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
180f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
181f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!conf) {
182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
183f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
184f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
185f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
186f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
187f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
188f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
189f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#ifdef EGL_MESA_screen_surface
190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
191f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
192f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
193f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
194f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
195f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
196f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
197f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
198f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!scrn) {
199f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
200f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
201f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
202f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
203f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
204f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
205f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
206f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
207f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
208f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
209f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
210f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
211f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
212f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!m) {
213f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
214f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
215f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
216f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
217f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
218f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
219f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
220f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */
221f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
222f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
223f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
224655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display.
225655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
226655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE _EGLDisplay *
227655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display)
228655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
229655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *dpy = _eglLookupDisplay(display);
230655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (dpy)
231655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      _eglLockMutex(&dpy->Mutex);
232655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   return dpy;
233655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
234655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
235655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
236655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
237655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display.
238655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
239655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE void
240655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy)
241655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
242655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglUnlockMutex(&dpy->Mutex);
243655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
244655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
245655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
246655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
2476052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
248db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display.
249adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
2501ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
2514aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
252adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
253f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLPlatformType plat = _eglGetNativePlatform();
254f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay);
255721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
256adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
257adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
258adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2596052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
2606052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
2616052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
2626052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
2631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
264adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
265adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
266655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
26712297f1f98c5daf177938b2598e6fb8ed97a9a66Vinson Lee   EGLint major_int = 0, minor_int = 0;
2687e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
270bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
2712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
272a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
273a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
27457929eda3e876dc60be7060237a669f042be2376Chia-I Wu
275a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      if (!drv) {
276a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu         _eglPreloadDrivers();
277a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu         drv = _eglMatchDriver(disp);
278681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg	 /* Initialize the particular display now */
279681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg	 if (drv && !drv->API.Initialize(drv, disp, &major_int, &minor_int))
280681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg	    RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
281a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      }
282681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg      if (!drv)
283681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg	 /* Load and initialize the first default driver that works */
284681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg	 drv = _eglLoadDefaultDriver(disp, &major_int, &minor_int);
285681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg      if (!drv)
286681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg	 RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
287c56e15b093c367e7e17ebd2e153baab8cafd213aBrian Paul
2885a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APImajor = major_int;
2895a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APIminor = minor_int;
2901e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu      _eglsnprintf(disp->Version, sizeof(disp->Version),
2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               "%d.%d (%s)", major_int, minor_int, drv->Name);
2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
293310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
294310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      disp->ClientAPIsMask &= _EGL_API_ALL_BITS;
2955a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu
2962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = drv;
297a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_TRUE;
2982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } else {
2995a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      major_int = disp->APImajor;
3005a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      minor_int = disp->APIminor;
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)) {
3052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *major = major_int;
3062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *minor = minor_int;
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
405bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT, drv);
406b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!share && share_list != EGL_NO_CONTEXT)
407bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
4082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
410b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (context) ? _eglLinkContext(context, disp) : EGL_NO_CONTEXT;
411b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
412bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
413adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
414adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
415adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4161ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
419655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
420aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
421aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
422b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
423aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
424bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
4252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
426b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyContext(drv, disp, context);
427b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
428bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
429adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
430adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
431adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4321ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
4342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
435adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
436655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
4382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
4392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
4402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
441b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
4422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
44317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
444bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
44517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
44617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
44717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
44817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
44917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
45017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
451bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
45217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
4532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
454bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(disp, EGL_TRUE);
45517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
4562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
457bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
4582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((!draw_surf && draw != EGL_NO_SURFACE) ||
4592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu       (!read_surf && read != EGL_NO_SURFACE))
460bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
4612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
462b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
463b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
464bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
465adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
466adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
467adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
4702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
471adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
472655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
473aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
474aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
475b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
476aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
477bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
478b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryContext(drv, disp, context, attribute, value);
479b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
480bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
481adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
482adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
483adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4841ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
4864aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativeWindowType window, const EGLint *attrib_list)
487adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
488655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
492b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
4932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
494bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
495f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
496f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
4972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
499b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
500b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
501bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
502adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
503adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
504adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5051ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
5074aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
508adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
509655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
513b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
515bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
516f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
517f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
5182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
520b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
521b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
522bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
523adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
524adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
525adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5261ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
5282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
529adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
530655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
534b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
536bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
5372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
539b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
540b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
541bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
542adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
543adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
544adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5451ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
546adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
547adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
548655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
549aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
550aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
551b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
552aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
553bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
5542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
555b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroySurface(drv, disp, surf);
556b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
557bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
558adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
5622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
563adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
564655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
565aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
566aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
567b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
568aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
569bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
570b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
571b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
572bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
573adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
574adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5751ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
5772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
578adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
579655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
580aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
581aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
582b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
583aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
584bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
585b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
586b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
587bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
588adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
592adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
593adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
594655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
595aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
596aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
597b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
598aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
599bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
600b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.BindTexImage(drv, disp, surf, buffer);
601b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
602bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
603adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
604adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
605adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6061ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
607adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
609655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
610aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
611aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
612b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
613aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
614bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
615b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer);
616b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
617bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
618adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
619adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
620adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6211ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
622adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
623adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
624655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
62557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
62657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
627aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
628b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
629aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
630bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
63157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
632ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || ctx->Resource.Display != disp)
633bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
63457da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
63557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
63657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   if (!_eglIsSurfaceLinked(surf))
637bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
63857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
639b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapInterval(drv, disp, surf, interval);
640b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
641bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
642adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
643adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
644adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6451ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
647adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
648bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
649655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
650aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
651aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
652b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
653aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
654bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
655bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
656bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
657bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
658bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
659b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
660b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapBuffers(drv, disp, surf);
661bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
662bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
663adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
664adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
665adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6661ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6674aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
668adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
669655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
670aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
671aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
672b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
673aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
674bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
675f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
676f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE);
677b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyBuffers(drv, disp, surf, target);
678b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
679bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
680adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
681adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
682adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6831ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6846c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void)
685adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6866c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
6876c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
6882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
689b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
6902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6916c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
692bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
6932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
694ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
695655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
696655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
697655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   /* let bad current context imply bad current surface */
698655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
699bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
700b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
701b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
702a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
704b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitClient(drv, disp, ctx);
7056c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
706bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
7076c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
7086c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7106c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
7116c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
7126c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
7136c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2
7146c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
7156c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint api_index = t->CurrentAPIIndex;
7166c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
7176c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLBoolean ret;
7186c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7196c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (api_index != es_index && _eglIsCurrentThreadDummy())
720bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
7216c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7226c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = es_index;
7236c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   ret = eglWaitClient();
7246c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = api_index;
7256c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return ret;
7266c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else
7276c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return eglWaitClient();
7286c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif
729adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
730adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
731adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7321ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
733adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
734adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7356c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7366c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
738b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7406c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
741bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
742b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
743655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   disp = ctx->Resource.Display;
744655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
745655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
7466c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
7476c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
748bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
749b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
750b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
751a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
753b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitNative(drv, disp, engine);
7542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
755bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
756adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
757adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
758adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7591ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
762a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
763b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLDisplay ret;
764b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
765b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
766b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
767bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
768adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
769adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
770adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7711ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
772adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
773adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
774adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
775b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
776b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
777b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetContextHandle(ctx);
778b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
779bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
780adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
781adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
782adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7831ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
784adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
785adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
78661906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
787b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLint err = EGL_SUCCESS;
78861906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
789b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
79061906631202af855d0742586956ff9f34522a525Chia-I Wu
79161906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
792bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
79361906631202af855d0742586956ff9f34522a525Chia-I Wu
79461906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
79561906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
79661906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
79761906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
79861906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
79961906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
80061906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
80161906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
80261906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
803b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      err = EGL_BAD_PARAMETER;
80461906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
80561906631202af855d0742586956ff9f34522a525Chia-I Wu   }
80661906631202af855d0742586956ff9f34522a525Chia-I Wu
807b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetSurfaceHandle(surf);
808b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
809bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(NULL, err, ret);
810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
811adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
812adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
814adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
815adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
81648822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
81748822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
81875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
81975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
820adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
821adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
822adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
823adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
82495f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY
82595f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname)
826adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8279061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
828adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
829adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
8309061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
8319061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      /* extensions only */
832b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
8337012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
8347012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
8357012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
8361c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
8377012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
8387012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
83948822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
8407012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
8417012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
8427012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
8437012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
8447012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
845b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
846a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
847a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
848a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR },
849a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
85052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
85152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK },
85252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif
853adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
854adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
855adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
856b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   _EGLProc ret;
8579061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
8589061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
859bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, NULL);
860b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
861b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = NULL;
8629061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
8639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
864b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0) {
865b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            ret = egl_functions[i].function;
866b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            break;
867b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         }
868adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
869adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
870b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret)
871bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, ret);
872e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
87357929eda3e876dc60be7060237a669f042be2376Chia-I Wu   _eglPreloadDrivers();
874e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu
875e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   /* now loop over drivers to query their procs */
876e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   for (i = 0; i < _eglGlobal.NumDrivers; i++) {
8773e6139d158a054a0dfe8def28bf60201cdb9f385Chia-I Wu      _EGLDriver *drv = _eglGlobal.Drivers[i];
878b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      ret = drv->API.GetProcAddress(drv, procname);
879b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      if (ret)
880b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         break;
881e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   }
882e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
883bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
884adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
885adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
886adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8879061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
8889061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
8899061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
890adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
891adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
892adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
893adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8941ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
895c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
896adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
897adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
898adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
899655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
900aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
901aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
902b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
903aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
904bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
905b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
906b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         modes, modes_size, num_modes);
907b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
908bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
909adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
910adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
911adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
9142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
915adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
916655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
917aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
918aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
919b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
920aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
921bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
922b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
923b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
924bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
925adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
926adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
927adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9281ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
9302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
931adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
932655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
933aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
934aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
935b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
936aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
937bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, EGL_FALSE, drv);
938b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
939b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
940bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
941adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
942adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
943adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9441ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
9462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
9472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
948655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
9492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
9502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
9512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
952b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
9532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
954bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, source_context, EGL_FALSE, drv);
955b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!dest_context)
956bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
9572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
958b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyContextMESA(drv, disp,
959b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         source_context, dest_context, mask);
960b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
961bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
9621c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
9631c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
9641c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
965adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
9662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
9672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
968adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
969655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
970aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
971b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
972aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
973bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
974b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetScreensMESA(drv, disp, screens, max_screens, num_screens);
975b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
976bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
977adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
978adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
979adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
980c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PaulEGLSurface
9812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
9822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
983adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
984655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
9852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
9862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
988b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
9892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
990bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
9912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
993b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
994b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
995bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
996adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
997adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
998adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
999adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
10002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
10012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
1002adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1003655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
10062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
10072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1008b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1010bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
10112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
1012bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
10132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
1014bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_MODE_MESA, EGL_FALSE);
1015b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1016b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
10172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1018bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1019adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1020adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1021adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1022adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
10237012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
1024adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1025655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1026aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1027aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1028b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1029aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1030bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1031b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
1032b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1033bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10347012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
10357012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10367012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10377012d01d888d482f2c6ad1180231a482026d213aJon SmirlEGLBoolean
10382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
10392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
10407012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1041655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1042aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1043aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1044b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1045aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1046bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1047b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
1048b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1049bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1050adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1051adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1052adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1053adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
10542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
10552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
1056adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1057655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1061b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1063bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1064b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf);
1065b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && surface)
10662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
1067b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1068bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1069adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1070adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1071adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1072adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
10737012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
1074adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1075655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
1079b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1081bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1082b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenModeMESA(drv, disp, scrn, &m);
1083b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && mode)
10842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
10852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1086bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1087adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1088adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1089adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10907012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char *
10917012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
10927012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1093655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1094aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
1095aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1096b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
1097aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1098bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, NULL, drv);
1099b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryModeStringMESA(drv, disp, m);
1100b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1101bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
11027012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
11037012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11047012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11059061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
11069061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
11079061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
1108b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
1109b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
1110b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
1111b2006a40eb22899d38cd31691640555228e36975Brian Paul
1112b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
1113b2006a40eb22899d38cd31691640555228e36975Brian Paul
1114d5078b94323241a6482f54797756116b1c864327Brian Paul
1115d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1116d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
1117d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
1118d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
1119d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
1120d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
1121d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1122d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
1123d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
1124d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
1125d5078b94323241a6482f54797756116b1c864327Brian Paul */
1126b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
1127b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
1128b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1129b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1130b2006a40eb22899d38cd31691640555228e36975Brian Paul
113175da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
1132bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
113375da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
113421b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
1135bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
113621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
1137310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
1138b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1139bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1140b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1141b2006a40eb22899d38cd31691640555228e36975Brian Paul
1142b2006a40eb22899d38cd31691640555228e36975Brian Paul
1143d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1144d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1145d5078b94323241a6482f54797756116b1c864327Brian Paul */
1146d5078b94323241a6482f54797756116b1c864327Brian PaulEGLenum
1147d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1148d5078b94323241a6482f54797756116b1c864327Brian Paul{
1149d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1150b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLenum ret;
1151b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1152b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
1153b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglConvertApiFromIndex(t->CurrentAPIIndex);
1154b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1155bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1156d5078b94323241a6482f54797756116b1c864327Brian Paul}
1157d5078b94323241a6482f54797756116b1c864327Brian Paul
1158d5078b94323241a6482f54797756116b1c864327Brian Paul
1159b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLSurface
1160b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1161b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1162b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1163b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1164655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
11662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1168b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
11692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1170bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
11712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
11722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
11732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
1174b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
1175b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1176bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1177b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1178b2006a40eb22899d38cd31691640555228e36975Brian Paul
1179b2006a40eb22899d38cd31691640555228e36975Brian Paul
1180b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
1181b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1182b2006a40eb22899d38cd31691640555228e36975Brian Paul{
118311cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
11842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
118511cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
118645ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      EGLint api_index = t->CurrentAPIIndex;
118711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      EGLint i;
118811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu
118911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      for (i = 0; i < _EGL_API_NUM_APIS; i++) {
119011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         _EGLContext *ctx = t->CurrentContexts[i];
119111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         if (ctx) {
119211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDisplay *disp = ctx->Resource.Display;
1193655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _EGLDriver *drv;
1194655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
119545ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu            t->CurrentAPIIndex = i;
1196655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
1197655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglLockMutex(&disp->Mutex);
1198655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            drv = disp->Driver;
119917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu            (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
1200655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglUnlockMutex(&disp->Mutex);
120111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         }
12022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
120345ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu
120445ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      t->CurrentAPIIndex = api_index;
1205b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
12062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
120775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1208b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1209bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1210b2006a40eb22899d38cd31691640555228e36975Brian Paul}
12117012d01d888d482f2c6ad1180231a482026d213aJon Smirl
12127012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1213b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
1214a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1215a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1216a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
1217a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1218a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1219a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WuEGLImageKHR
1220a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1221a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1222a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1223655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1224a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1225a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1226a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1227b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLImageKHR ret;
1228a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1229bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
1230b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
1231bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1232a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1233a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1234a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
1235b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR;
1236b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1237bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1238a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1239a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1240a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1241b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WuEGLBoolean
1242b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WueglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
1243a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1244655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1245a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1246a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1247b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1248a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1249bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
1250a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1251bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1252a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1253a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1254b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyImageKHR(drv, disp, img);
1255b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1256bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1257a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1258a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1259a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1260a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
126152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
126252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
126352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
126452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
126552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergEGLBoolean
126652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
126752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg			EGLint numRects, const EGLint *rects)
126852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{
126952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLContext *ctx = _eglGetCurrentContext();
127052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
127152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLSurface *surf = _eglLookupSurface(surface, disp);
127252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDriver *drv;
127352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   EGLBoolean ret;
127452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
127552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
127652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
127752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   /* surface must be bound to current context in EGL 1.4 */
127852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
127952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
128052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
128152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   if (drv->API.SwapBuffersRegionNOK)
128252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
128352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   else
128452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      ret = drv->API.SwapBuffers(drv, disp, surf);
128552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
128652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
128752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg}
128852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
128952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif /* EGL_NOK_swap_region */
1290