eglapi.c revision b90a3e7d8b1bcd412ddbf2a4803de2756dacd436
1adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
2adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Public EGL API entrypoints
3adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
4adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Generally, we use the EGLDisplay parameter as a key to lookup the
5adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * appropriate device driver handle, then jump though the driver's
6adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * dispatch table to handle the function.
7adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
8adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * That allows us the option of supporting multiple, simultaneous,
9adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * heterogeneous hardware devices in the future.
10adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
11adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * The EGLDisplay, EGLConfig, EGLContext and EGLSurface types are
12aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * opaque handles. Internal objects are linked to a display to
13aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * create the handles.
14adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
15aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * For each public API entry point, the opaque handles are looked up
16aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * before being dispatched to the drivers.  When it fails to look up
17aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * a handle, one of
18aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
19aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_DISPLAY
20aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_CONFIG
21aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_CONTEXT
22aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_SURFACE
23aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_SCREEN_MESA
24aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_MODE_MESA
25aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
26aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * is generated and the driver function is not called. An
27aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * uninitialized EGLDisplay has no driver associated with it. When
28aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * such display is detected,
29aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
30aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_NOT_INITIALIZED
31aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu *
32aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * is generated.
33adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
34bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * Some of the entry points use current display, context, or surface
35bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * implicitly.  For such entry points, the implicit objects are also
36bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * checked before calling the driver function.  Other than the
37bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * errors listed above,
38bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
39bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * EGL_BAD_CURRENT_SURFACE
40bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
41bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * may also be generated.
42bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu *
43adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Notes on naming conventions:
44adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
45adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * eglFooBar    - public EGL function
46adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_FOO_BAR  - public EGL token
47adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGLDatatype  - public EGL datatype
48adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
49adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _eglFooBar   - private EGL function
50adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _EGLDatatype - private EGL datatype, typedef'd struct
51adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _egl_struct  - private EGL struct, non-typedef'd
52adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
53adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
54adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
55adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
56adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <stdio.h>
57b2006a40eb22899d38cd31691640555228e36975Brian Paul#include <stdlib.h>
58adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <string.h>
591e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu
601e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu#include "eglstring.h"
61adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h"
62adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h"
63adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
6494cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
65adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
66adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h"
692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h"
70a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h"
71adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
72adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
73adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
74f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint.
75655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu *
76655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * These macros will unlock the display and record the error code.
77f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
78bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_ERROR(disp, err, ret)        \
79bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                         \
80655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      if (disp)                                 \
81655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu         _eglUnlockDisplay(disp);               \
82f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      /* EGL error codes are non-zero */        \
83f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      if (err)                                  \
84f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu         _eglError(err, __FUNCTION__);          \
85bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      return ret;                               \
86bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
87bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
88bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_SUCCESS(disp, ret) \
89bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, EGL_SUCCESS, ret)
90bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
91b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu/* record EGL_SUCCESS only when ret evaluates to true */
92bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_EVAL(disp, ret) \
93bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(disp, (ret) ? EGL_SUCCESS : 0, ret)
94f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
95f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
96bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu/*
97f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking.
98f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
99bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
100bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret, drv)         \
101bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                            \
102bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);  \
103bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                    \
104bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);           \
105bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
106bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
107bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret, drv)      \
108bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   do {                                                   \
109bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      drv = _eglCheck ## type(disp, obj, __FUNCTION__);   \
110bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      if (!drv)                                           \
111bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, 0, ret);                  \
112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   } while (0)
113bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
114bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SURFACE(disp, surf, ret, drv) \
115bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Surface, surf, ret, drv)
116bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
117bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONTEXT(disp, context, ret, drv) \
118bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Context, context, ret, drv)
119bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
120bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONFIG(disp, conf, ret, drv) \
121bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Config, conf, ret, drv)
122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
123bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SCREEN(disp, scrn, ret, drv) \
124bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Screen, scrn, ret, drv)
125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_MODE(disp, m, ret, drv) \
127bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_OBJECT(disp, Mode, m, ret, drv)
128bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu
129f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
130f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
131f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
132f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
133f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
134f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp) {
135f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
136f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
137f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
138f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp->Initialized) {
139f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
140f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
141f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
142f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return disp->Driver;
143f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
144f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
145f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
146f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
147f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
148f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
149f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
150f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
151f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
152f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!surf) {
153f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
154f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
155f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
156f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
157f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
160f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!context) {
167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
175f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
177f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
178f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
179f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
180f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!conf) {
181f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
183f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
184f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
185f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
186f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
187f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
188f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#ifdef EGL_MESA_screen_surface
189f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
191f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
192f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
193f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
194f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
195f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
196f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
197f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!scrn) {
198f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
199f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
200f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
201f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
202f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
203f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
204f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
205f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
206f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
207f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
208f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
209f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
210f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
211f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!m) {
212f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
213f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
214f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
215f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
216f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
217f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
218f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
219f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */
220f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
221f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
222f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
223655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display.
224655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
225655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE _EGLDisplay *
226655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display)
227655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
228655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *dpy = _eglLookupDisplay(display);
229655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (dpy)
230655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu      _eglLockMutex(&dpy->Mutex);
231655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   return dpy;
232655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
233655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
234655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
235655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
236655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display.
237655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */
238655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE void
239655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy)
240655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{
241655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglUnlockMutex(&dpy->Mutex);
242655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu}
243655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
244655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
245655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/**
2466052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
247db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display.
248adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
2491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
2504aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
251adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
252f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLPlatformType plat = _eglGetNativePlatform();
253f22665df95406567193dee0089f4830664ff4101Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay);
254721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
255adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
256adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
257adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2586052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
2596052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
2606052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
2616052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
2621ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
263adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
264adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
265655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
2667e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
2672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
268bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
270a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
271f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      if (!_eglMatchDriver(disp, EGL_FALSE))
272f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE);
2732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
274f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      _eglsnprintf(disp->Version, sizeof(disp->Version), "%d.%d (%s)",
275f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu            disp->APImajor, disp->APIminor, disp->Driver->Name);
276310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
277310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      disp->ClientAPIsMask &= _EGL_API_ALL_BITS;
278adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
2792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
2812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
282f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      *major = disp->APImajor;
283f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      *minor = disp->APIminor;
2842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
286bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
287adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
288adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
289adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2901ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
291adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
292adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
293655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
2942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
296bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE);
2972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
298a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (disp->Initialized) {
299a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
300a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu
301ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
302a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      /* do not reset disp->Driver */
303a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_FALSE;
3042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
306bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(disp, EGL_TRUE);
3072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
3082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3101ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
311adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
312adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
313655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
314aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
315b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
316aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
317bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, NULL, drv);
318b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryString(drv, disp, name);
319b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
320bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
321adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
322adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
323adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3241ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
3262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
327adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
328655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
329aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
330b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
331aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
332bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
333b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
334b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
335bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
336adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
337adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
338adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3391ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
342adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
343655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
344aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
345b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
346aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
347bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
348b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
350b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
351bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
352adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
353adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
354adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3551ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
3572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
358adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
359655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
362b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
3632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
364bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv);
365b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
366b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
367bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
368adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
369adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
370adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3711ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
3722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
3732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
3742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
375655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
3762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
3782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
380b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
3812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
382b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   if (config)
383b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg      _EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT, drv);
384b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   else
385b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg      drv = _eglCheckDisplay(disp, __FUNCTION__);
386b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg
387b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!share && share_list != EGL_NO_CONTEXT)
388bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT);
3892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
391b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (context) ? _eglLinkContext(context, disp) : EGL_NO_CONTEXT;
392b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
393bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
394adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
395adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
396adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3971ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
398adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
399adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
400655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
401aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
402aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
403b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
404aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
405bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
4062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
407b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyContext(drv, disp, context);
408b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
409bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
410adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
411adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
412adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
4152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
417655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
4192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
4202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
4212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
422b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
42417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
425bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
42617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
42717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
42817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
42917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
43017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
43117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
432bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu         RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE);
43317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
4342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
435bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(disp, EGL_TRUE);
43617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
4372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
438bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
4392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((!draw_surf && draw != EGL_NO_SURFACE) ||
4402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu       (!read_surf && read != EGL_NO_SURFACE))
441bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
4422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
443b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
444b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
445bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
446adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
447adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
448adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
4512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
452adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
453655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
454aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
455aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
456b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
457aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
458bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv);
459b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryContext(drv, disp, context, attribute, value);
460b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
461bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
462adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
463adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
464adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4651ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
4674aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativeWindowType window, const EGLint *attrib_list)
468adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
469655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
473b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
4742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
475bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
476f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
477f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
4782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
480b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
481b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
482bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
483adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
484adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
485adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4861ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
4884aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
489adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
490655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
4912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
494b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
4952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
496bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
497f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
498f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE);
4992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
501b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
502b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
503bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
504adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
505adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
506adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5071ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
5092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
510adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
511655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
5122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
515b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
5162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
517bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
5182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, 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 PaulEGLBoolean EGLAPIENTRY
527adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
528adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
529655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
530aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
531aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
532b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
533aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
534bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
5352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
536b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroySurface(drv, disp, surf);
537b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
538bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
539adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
540adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5411ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
5432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
544adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
545655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
546aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
547aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
548b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
549aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
550bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
551b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QuerySurface(drv, disp, surf, attribute, value);
552b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
553bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
554adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
555adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5561ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
5582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
560655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
561aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
562aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
563b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
564aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
565bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
566b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
567b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
568bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
569adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
570adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
571adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5721ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
573adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
574adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
575655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
576aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
577aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
578b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
579aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
580bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
581b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.BindTexImage(drv, disp, surf, buffer);
582b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
583bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
584adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
585adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
586adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5871ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
588adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
590655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
591aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
592aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
593b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
594aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
595bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
596b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer);
597b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
598bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
599adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
600adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
601adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6021ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
603adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
604adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
605655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
60657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
60757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
608aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
609b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
610aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
611bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
61257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
613ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || ctx->Resource.Display != disp)
614bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
61557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
61657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
61757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   if (!_eglIsSurfaceLinked(surf))
618bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
61957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
620b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapInterval(drv, disp, surf, interval);
621b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
622bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
623adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
624adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
625adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6261ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
628adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
629bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
630655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
631aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
632aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
633b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
634aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
635bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
636bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
637bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
638bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
639bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
640b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
641b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.SwapBuffers(drv, disp, surf);
642bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
643bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
644adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
645adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
646adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6471ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6484aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
649adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
650655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
651aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
652aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
653b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
654aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
655bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
656f22665df95406567193dee0089f4830664ff4101Chia-I Wu   if (disp->Platform != _eglGetNativePlatform())
657f22665df95406567193dee0089f4830664ff4101Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE);
658b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyBuffers(drv, disp, surf, target);
659b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
660bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
661adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
662adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
663adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6656c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void)
666adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6676c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
6686c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
6692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
670b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
6712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6726c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
673bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
6742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
675ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
676655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
677655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
678655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   /* let bad current context imply bad current surface */
679655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
680bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
681b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
682b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
683a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
6842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
685b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitClient(drv, disp, ctx);
6866c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
687bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
6886c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
6896c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
6902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6916c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
6926c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
6936c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
6946c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2
6956c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
6966c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint api_index = t->CurrentAPIIndex;
6976c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
6986c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLBoolean ret;
6996c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7006c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (api_index != es_index && _eglIsCurrentThreadDummy())
701bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
7026c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
7036c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = es_index;
7046c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   ret = eglWaitClient();
7056c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = api_index;
7066c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return ret;
7076c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else
7086c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return eglWaitClient();
7096c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif
710adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
711adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
712adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
714adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
715adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7166c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
7176c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
7182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
719b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
7202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7216c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
722bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
723b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
724655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   disp = ctx->Resource.Display;
725655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _eglLockMutex(&disp->Mutex);
726655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
7276c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
7286c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
729bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE);
730b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
731b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* a valid current context implies an initialized current display */
732a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
7332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
734b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.WaitNative(drv, disp, engine);
7352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
736bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
737adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
738adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
739adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7401ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
741adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
742adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
743a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
744b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLDisplay ret;
745b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
746b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
747b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
748bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
749adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
750adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
751adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
753adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
754adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
755adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
756b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLContext ret;
757b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
758b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetContextHandle(ctx);
759b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
760bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
762adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
763adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
765adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
766adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
76761906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
768b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLint err = EGL_SUCCESS;
76961906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
770b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
77161906631202af855d0742586956ff9f34522a525Chia-I Wu
77261906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
773bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE);
77461906631202af855d0742586956ff9f34522a525Chia-I Wu
77561906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
77661906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
77761906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
77861906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
77961906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
78061906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
78161906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
78261906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
78361906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
784b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu      err = EGL_BAD_PARAMETER;
78561906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
78661906631202af855d0742586956ff9f34522a525Chia-I Wu   }
78761906631202af855d0742586956ff9f34522a525Chia-I Wu
788b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglGetSurfaceHandle(surf);
789b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
790bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_ERROR(NULL, err, ret);
791adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
792adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
793adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7941ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
795adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
796adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
79748822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
79848822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
79975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
80075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
801adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
802adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
803adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
804adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
80595f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY
80695f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname)
807adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8089061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
809adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
8119061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
8129061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      /* extensions only */
813b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
8147012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
8157012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
8167012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
8171c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
8187012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
8197012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
82048822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
8217012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
8227012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
8237012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
8247012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
8257012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
826b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
82778d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
82878d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu      { "eglGetDRMDisplayMESA", (_EGLProc) eglGetDRMDisplayMESA },
82978d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif
830a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
831a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
832a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR },
833a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
83452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
83552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK },
83652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif
837adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
838adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
839adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
840b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   _EGLProc ret;
8419061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
8429061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
843bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_SUCCESS(NULL, NULL);
844b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
845b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = NULL;
8469061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
8479061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
848b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0) {
849b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            ret = egl_functions[i].function;
850b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu            break;
851b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         }
852adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
853adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
854f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu   if (!ret)
855f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu      ret = _eglGetDriverProc(procname);
856e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
857bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
858adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
859adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
860adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8619061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
8629061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
8639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
864adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
865adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
866adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
867adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
869c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
870adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
871adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
872adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
873655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
874aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
875aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
876b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
877aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
878bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
879b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
880b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         modes, modes_size, num_modes);
881b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
882bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
883adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
884adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
885adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8861ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
8872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
8882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
889adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
890655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
891aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
892aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
893b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
894aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
895bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
896b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
897b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
898bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
899adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
900adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
901adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9021ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
9042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
905adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
906655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
907aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
908aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
909b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
910aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
911bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, EGL_FALSE, drv);
912b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
913b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
914bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
915adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
916adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
917adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9181ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
9192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
9202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
9212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
922655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
9232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
9242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
9252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
926b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
9272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
928bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONTEXT(disp, source_context, EGL_FALSE, drv);
929b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!dest_context)
930bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE);
9312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
932b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.CopyContextMESA(drv, disp,
933b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu         source_context, dest_context, mask);
934b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
935bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
9361c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
9371c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
9381c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
939c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
9402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
9412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
942adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
943655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
944aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
945b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
946aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
947bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
948b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.GetScreensMESA(drv, disp, screens, max_screens, num_screens);
949b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
950bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
951adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
952adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
953adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
954c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
9552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
9562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
957adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
958655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
9592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
9602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
962b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
9632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
964bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
9652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
967b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
968b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
969bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
970adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
971adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
972adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
973c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
9742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
9752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
976adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
977655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
9782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
9792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
9802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
9812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
982b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
9832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
984bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
9852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
986bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
9872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
988bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_MODE_MESA, EGL_FALSE);
989b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
990b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
9912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
992bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
993adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
994adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
995adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
996c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
9977012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
998adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
999655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1000aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1001aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1002b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1003aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1004bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1005b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
1006b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1007bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10087012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
10097012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10107012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1011c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
10132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
10147012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1015655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1016aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLScreen *scrn = _eglLookupScreen(screen, disp);
1017aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1018b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1019aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1020bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1021b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
1022b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1023bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1024adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1025adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1026adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1027c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
10292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
1030adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1031655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1035b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1037bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1038b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf);
1039b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && surface)
10402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
1041b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1042bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1043adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1044adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1045adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1046c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
10477012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
1048adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1049655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
10502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
10512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
1053b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
10542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1055bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv);
1056b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryScreenModeMESA(drv, disp, scrn, &m);
1057b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (ret && mode)
10582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
10592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1060bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1061adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
1062adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1063adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1064c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledconst char * EGLAPIENTRY
10657012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
10667012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
1067655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1068aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
1069aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu   _EGLDriver *drv;
1070b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   const char *ret;
1071aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu
1072bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_MODE(disp, m, NULL, drv);
1073b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.QueryModeStringMESA(drv, disp, m);
1074b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1075bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
10767012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
10777012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10787012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10799061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
10809061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
10819061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
108278d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#ifdef EGL_MESA_drm_display
108378d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
108478d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WuEGLDisplay EGLAPIENTRY
108578d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I WueglGetDRMDisplayMESA(int fd)
108678d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu{
108778d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   _EGLDisplay *dpy = _eglFindDisplay(_EGL_PLATFORM_DRM, (void *) fd);
108878d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   return _eglGetDisplayHandle(dpy);
108978d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu}
109078d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
109178d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu#endif /* EGL_MESA_drm_display */
109278d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu
1093b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
1094b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
1095b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
1096b2006a40eb22899d38cd31691640555228e36975Brian Paul
1097b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
1098b2006a40eb22899d38cd31691640555228e36975Brian Paul
1099d5078b94323241a6482f54797756116b1c864327Brian Paul
1100d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1101d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
1102d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
1103d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
1104d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
1105d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
1106d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
1107d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
1108d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
1109d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
1110d5078b94323241a6482f54797756116b1c864327Brian Paul */
1111c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1112b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
1113b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1114b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1115b2006a40eb22899d38cd31691640555228e36975Brian Paul
111675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
1117bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE);
111875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
111921b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
1120bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE);
112121b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
1122310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
1123b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1124bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1125b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1126b2006a40eb22899d38cd31691640555228e36975Brian Paul
1127b2006a40eb22899d38cd31691640555228e36975Brian Paul
1128d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1129d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1130d5078b94323241a6482f54797756116b1c864327Brian Paul */
1131c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY
1132d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1133d5078b94323241a6482f54797756116b1c864327Brian Paul{
1134d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
1135b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLenum ret;
1136b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1137b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
1138b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = _eglConvertApiFromIndex(t->CurrentAPIIndex);
1139b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1140bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, ret);
1141d5078b94323241a6482f54797756116b1c864327Brian Paul}
1142d5078b94323241a6482f54797756116b1c864327Brian Paul
1143d5078b94323241a6482f54797756116b1c864327Brian Paul
1144c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY
1145b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1146b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1147b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1148b2006a40eb22899d38cd31691640555228e36975Brian Paul{
1149655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
11502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
11512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
11522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
1153b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLSurface ret;
11542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1155bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv);
11562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
11572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
11582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
1159b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE;
1160b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1161bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1162b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1163b2006a40eb22899d38cd31691640555228e36975Brian Paul
1164b2006a40eb22899d38cd31691640555228e36975Brian Paul
1165c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1166b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1167b2006a40eb22899d38cd31691640555228e36975Brian Paul{
116811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
11692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
117011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
117145ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      EGLint api_index = t->CurrentAPIIndex;
117211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      EGLint i;
117311cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu
117411cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      for (i = 0; i < _EGL_API_NUM_APIS; i++) {
117511cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         _EGLContext *ctx = t->CurrentContexts[i];
117611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         if (ctx) {
117711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDisplay *disp = ctx->Resource.Display;
1178655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _EGLDriver *drv;
1179655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
118045ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu            t->CurrentAPIIndex = i;
1181655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu
1182655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglLockMutex(&disp->Mutex);
1183655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            drv = disp->Driver;
118417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu            (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
1185655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu            _eglUnlockMutex(&disp->Mutex);
118611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         }
11872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
118845ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu
118945ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      t->CurrentAPIIndex = api_index;
1190b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
11912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
119275da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1193b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1194bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_SUCCESS(NULL, EGL_TRUE);
1195b2006a40eb22899d38cd31691640555228e36975Brian Paul}
11967012d01d888d482f2c6ad1180231a482026d213aJon Smirl
11977012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1198b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
1199a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1200a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1201a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
1202a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1203a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1204c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLImageKHR EGLAPIENTRY
1205a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1206a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1207a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1208655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1209a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1210a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1211a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1212b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLImageKHR ret;
1213a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1214bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv);
1215b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
1216bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);
1217a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1218a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1219a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
1220b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR;
1221b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1222bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1223a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1224a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1225a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1226c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
1227b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WueglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
1228a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1229655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu   _EGLDisplay *disp = _eglLockDisplay(dpy);
1230a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1231a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1232b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   EGLBoolean ret;
1233a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1234bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv);
1235a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1236bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu      RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE);
1237a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1238a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1239b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu   ret = drv->API.DestroyImageKHR(drv, disp, img);
1240b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu
1241bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu   RETURN_EGL_EVAL(disp, ret);
1242a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1243a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1244a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1245a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
124652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
124752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
124852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region
124952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
1250c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY
125152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface,
125252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg			EGLint numRects, const EGLint *rects)
125352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{
125452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLContext *ctx = _eglGetCurrentContext();
125552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDisplay *disp = _eglLockDisplay(dpy);
125652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLSurface *surf = _eglLookupSurface(surface, disp);
125752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGLDriver *drv;
125852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   EGLBoolean ret;
125952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
126052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv);
126152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
126252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   /* surface must be bound to current context in EGL 1.4 */
126352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
126452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE);
126552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
126652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   if (drv->API.SwapBuffersRegionNOK)
126752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects);
126852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   else
126952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg      ret = drv->API.SwapBuffers(drv, disp, surf);
127052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
127152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   RETURN_EGL_EVAL(disp, ret);
127252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg}
127352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg
127452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif /* EGL_NOK_swap_region */
1275