eglapi.c revision f3e03e1277839cddc35e0cc3427a7972bc17a10a
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>
59adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h"
60adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h"
61adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
62adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglglobals.h"
6394cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
64adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
65adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h"
682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h"
69a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h"
70adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
71adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
72adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
73f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint.
74f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
75f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_ERROR(disp, err, ret)              \
76f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   ({                                           \
77f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      /* EGL error codes are non-zero */        \
78f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      if (err)                                  \
79f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu         _eglError(err, __FUNCTION__);          \
80f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      ret;                                      \
81f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   })
82f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
83f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
84f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
85f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking.
86f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */
87f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret)                                   \
88f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   ({                                                                   \
89f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _EGLDriver *__drv = _eglCheckDisplay(disp, __FUNCTION__);         \
90f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      if (!__drv)                                                       \
91f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu         return _EGL_ERROR(disp, 0, ret);                               \
92f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      __drv;                                                            \
93f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   })
94f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
95f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
96f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret)                         \
97f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   ({                                                                   \
98f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _EGLDriver *__drv = _eglCheck ## type(disp, obj, __FUNCTION__);   \
99f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      if (!__drv)                                                       \
100f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu         return _EGL_ERROR(disp, 0, ret);                               \
101f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      __drv;                                                            \
102f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   })
103f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_SURFACE(disp, surf, ret)      \
104f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGL_CHECK_OBJECT(disp, Surface, surf, ret)
105f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_CONTEXT(disp, context, ret)   \
106f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGL_CHECK_OBJECT(disp, Context, context, ret)
107f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_CONFIG(disp, conf, ret)       \
108f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGL_CHECK_OBJECT(disp, Config, conf, ret)
109f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_SCREEN(disp, scrn, ret)       \
110f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGL_CHECK_OBJECT(disp, Screen, scrn, ret)
111f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_MODE(disp, m, ret)            \
112f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGL_CHECK_OBJECT(disp, Mode, m, ret)
113f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
114f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
115f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
116f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
117f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
118f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp) {
119f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
120f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
121f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
122f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!disp->Initialized) {
123f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
124f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
125f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
126f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return disp->Driver;
127f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
128f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
129f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
130f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
131f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
132f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
133f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
134f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
135f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
136f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!surf) {
137f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
138f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
139f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
140f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
141f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
142f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
143f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
144f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
145f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
146f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
147f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
148f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
149f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
150f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!context) {
151f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
152f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
153f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
154f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
155f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
156f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
157f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
160f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!conf) {
165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#ifdef EGL_MESA_screen_surface
173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
175f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
177f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
178f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
179f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
180f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
181f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!scrn) {
182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
183f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
184f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
185f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
186f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
187f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
188f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
189f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver *
190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
191f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{
192f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
193f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!drv)
194f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
195f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   if (!m) {
196f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
197f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu      return NULL;
198f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   }
199f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu   return drv;
200f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu}
201f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
202f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
203f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */
204f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
205f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu
206f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/**
2076052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
2086052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * We initialize our global vars and create a private _EGLDisplay object.
209adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
2101ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
2114aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
212adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
213adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLDisplay *dpy;
214be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   dpy = _eglFindDisplay(nativeDisplay);
215be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   if (!dpy) {
216be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu      dpy = _eglNewDisplay(nativeDisplay);
217be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu      if (dpy)
218be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu         _eglLinkDisplay(dpy);
219be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   }
220721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
221adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
222adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
223adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2246052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
2256052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
2266052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
2276052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
2281ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
229adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
230adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
2312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
2327e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White   EGLint major_int, minor_int;
2337e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
2342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
2352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
2362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
237a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (!disp->Initialized) {
238a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
23957929eda3e876dc60be7060237a669f042be2376Chia-I Wu
240a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      if (!drv) {
241a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu         _eglPreloadDrivers();
242a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu         drv = _eglMatchDriver(disp);
243a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu         if (!drv)
244a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu            return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
245a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      }
2462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      /* Initialize the particular display now */
248092b1ca989ba3bdc3f4d421b83b3943af260b7dbChia-I Wu      if (!drv->API.Initialize(drv, disp, &major_int, &minor_int))
2492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
250c56e15b093c367e7e17ebd2e153baab8cafd213aBrian Paul
2515a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APImajor = major_int;
2525a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APIminor = minor_int;
2535a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      snprintf(disp->Version, sizeof(disp->Version),
2542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               "%d.%d (%s)", major_int, minor_int, drv->Name);
2552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
256310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
257310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      disp->ClientAPIsMask &= _EGL_API_ALL_BITS;
2585a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu
2592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = drv;
260a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_TRUE;
2612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } else {
2625a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      major_int = disp->APImajor;
2635a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      minor_int = disp->APIminor;
264adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
2652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
2672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
2682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *major = major_int;
2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *minor = minor_int;
2702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
273adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
274adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
275adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
277adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
278adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
2792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
2802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
2822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
2832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
284a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   if (disp->Initialized) {
285a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      _EGLDriver *drv = disp->Driver;
286a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu
287ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
288a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      /* do not reset disp->Driver */
289a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu      disp->Initialized = EGL_FALSE;
2902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
2932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD(dpy)                                   \
2972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
3002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);              \
3012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
3022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
3032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
3042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface)              \
3072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
3082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface((surface), disp);     \
3092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
3102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
3112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckSurface(disp, surf, __FUNCTION__);        \
3122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
3132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
3142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
3152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx)                  \
3182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
3192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext((ctx), disp);      \
3202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
3212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
3222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckContext(disp, context, __FUNCTION__);     \
3232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
3242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
3252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
3262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen)                \
3292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
3302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((screen), disp);        \
3312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
3322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
3332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckScreen(disp, scrn, __FUNCTION__);         \
3342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
3352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
3362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
3372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_MODE(dpy, mode)                    \
3402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
3412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode((mode), disp);                 \
3422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
3432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
3442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckMode(disp, m, __FUNCTION__);              \
3452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
3462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
3472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
3482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3501ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
352adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryString(drv, disp, name);
355adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
356adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3581ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
3602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
361adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
364adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
365adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
366adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3671ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
370adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
374adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
375adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
376adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3771ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
3792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
380adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
3882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
390adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
391adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
392adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
3942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
3952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
4022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
4062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!share && share_list != EGL_NO_CONTEXT) {
4072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
4082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
4092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
4102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
4122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (context)
4132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkContext(context, disp);
4142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4191ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
420adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
421adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
4242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroyContext(drv, disp, context);
425adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
426adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
427adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4281ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
4302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
431adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
4342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
4352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
4362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
43817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp)
43917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
44017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   drv = disp->Driver;
44117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
44217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   /* display is allowed to be uninitialized under certain condition */
44317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   if (!disp->Initialized) {
44417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE ||
44517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu          ctx != EGL_NO_CONTEXT)
44617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu         return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
44717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu   }
4482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
44917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu      return EGL_TRUE;
45017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu
4512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
4522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
4532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((!draw_surf && draw != EGL_NO_SURFACE) ||
4542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu       (!read_surf && read != EGL_NO_SURFACE))
4552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
4562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
458adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
459adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
460adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4611ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
4632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
464adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
4662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryContext(drv, disp, context, attribute, value);
467adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
468adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
469adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4701ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
4724aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativeWindowType window, const EGLint *attrib_list)
473adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
4842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
488adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
489adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
490adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
4934aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
494adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
5012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
5022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
5032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
5052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
5062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
5072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
5082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
509adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
510adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
511adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
5132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
5142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
515adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
5172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
5182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
5202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
5222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
5232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
5242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
5262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
5272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
5282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
5292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
530adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
531adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
532adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5331ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
534adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
535adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
5382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroySurface(drv, disp, surf);
539adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
540adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5411ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
5432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
544adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QuerySurface(drv, disp, surf, attribute, value);
547adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
548adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
5512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
552adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
555adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
556adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
557adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5581ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
560adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.BindTexImage(drv, disp, surf, buffer);
563adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
564adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
565adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5661ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
567adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
568adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ReleaseTexImage(drv, disp, surf, buffer);
571adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
572adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
573adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5741ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
575adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
576adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
57757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
57857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
5792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
58057da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
581ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || ctx->Resource.Display != disp)
58257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu      return _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
58357da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
58457da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
58557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   if (!_eglIsSurfaceLinked(surf))
58657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
58757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
58857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   return drv->API.SwapInterval(drv, disp, surf, interval);
589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
591adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5921ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
594adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
595bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
5962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
597bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
598bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
599bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
600bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
601bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
6022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SwapBuffers(drv, disp, surf);
603adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
604adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
605adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6061ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6074aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
6102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyBuffers(drv, disp, surf, target);
611adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
612adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
613adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6141ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6156c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void)
616adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6176c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
6186c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
6192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
6202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6216c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
6222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
6236c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
6246c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
6256c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu      return _eglError(EGL_BAD_CURRENT_SURFACE, __FUNCTION__);
6262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6276c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* a valid current context implies an initialized current display */
628ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
629a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
6302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
6316c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
6326c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return drv->API.WaitClient(drv, disp, ctx);
6336c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
6346c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
6352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6366c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
6376c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
6386c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
6396c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2
6406c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
6416c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint api_index = t->CurrentAPIIndex;
6426c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
6436c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLBoolean ret;
6446c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
6456c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (api_index != es_index && _eglIsCurrentThreadDummy())
6466c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglWaitGL");
6476c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
6486c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = es_index;
6496c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   ret = eglWaitClient();
6506c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = api_index;
6516c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return ret;
6526c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else
6536c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return eglWaitClient();
6546c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif
655adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
656adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
657adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6581ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
659adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
660adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6616c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
6626c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
6632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
6642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6656c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
6662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
6676c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
6686c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
6696c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu      return _eglError(EGL_BAD_CURRENT_SURFACE, __FUNCTION__);
6702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6716c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* a valid current context implies an initialized current display */
672ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
673a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu   assert(disp->Initialized);
6742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
6752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitNative(drv, disp, engine);
677adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
678adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
679adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6801ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
681adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
682adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
683a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
684a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu   return (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY;
685adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
686adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
687adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6881ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
689adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
690adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
691adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
6925e7dba541298a29f175f9d077bf6f63030465d94Brian Paul   return _eglGetContextHandle(ctx);
693adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
694adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
695adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6961ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
697adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
698adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
69961906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
70061906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
70161906631202af855d0742586956ff9f34522a525Chia-I Wu
70261906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
70361906631202af855d0742586956ff9f34522a525Chia-I Wu      return EGL_NO_SURFACE;
70461906631202af855d0742586956ff9f34522a525Chia-I Wu
70561906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
70661906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
70761906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
70861906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
70961906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
71061906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
71161906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
71261906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
71361906631202af855d0742586956ff9f34522a525Chia-I Wu      _eglError(EGL_BAD_PARAMETER, __FUNCTION__);
71461906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
71561906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
71661906631202af855d0742586956ff9f34522a525Chia-I Wu   }
71761906631202af855d0742586956ff9f34522a525Chia-I Wu
71861906631202af855d0742586956ff9f34522a525Chia-I Wu   return _eglGetSurfaceHandle(surf);
719adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
720adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
721adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
723adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
724adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
72548822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
72648822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
72775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
72875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
729adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
730adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
731adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
732adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
73395f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY
73495f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname)
735adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7369061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
737adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
738adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
7399061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
7409061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      /* extensions only */
741b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
7427012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
7437012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
7447012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
7451c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
7467012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
7477012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
74848822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
7497012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
7507012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
7517012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
7527012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
7537012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
754b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
755a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
756a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
757a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR },
758a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
759adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
7629061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
7639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
7649061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      return NULL;
7659061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
7669061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
7679061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0)
7689061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu            return egl_functions[i].function;
769adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
770adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
771e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
77257929eda3e876dc60be7060237a669f042be2376Chia-I Wu   _eglPreloadDrivers();
773e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu
774e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   /* now loop over drivers to query their procs */
775e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   for (i = 0; i < _eglGlobal.NumDrivers; i++) {
7763e6139d158a054a0dfe8def28bf60201cdb9f385Chia-I Wu      _EGLDriver *drv = _eglGlobal.Drivers[i];
7773e6139d158a054a0dfe8def28bf60201cdb9f385Chia-I Wu      _EGLProc p = drv->API.GetProcAddress(drv, procname);
778e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul      if (p)
779e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul         return p;
780e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   }
781e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
782adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return NULL;
783adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
784adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
785adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7869061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
7879061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
7889061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
789adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
790adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
791adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
792adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
794c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
795adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
796adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
797adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
8002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  modes, modes_size, num_modes);
801adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
802adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
803adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8041ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
8052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
8062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
807adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
8092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
811adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
812adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
8142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
8152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
816adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
8182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
819adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
820adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
821adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
8232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
8242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
8252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
8262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
8282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
8292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckContext(disp, source_context, __FUNCTION__);
8322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv || !dest_context) {
8332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (drv)
8342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
8351c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      return EGL_FALSE;
8362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
8372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyContextMESA(drv, disp, source_context, dest_context,
8392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                   mask);
8401c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
8411c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
8421c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
843adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
8452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
846adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
8482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetScreensMESA(drv, disp, screens,
8492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  max_screens, num_screens);
850adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
851adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
852adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
853c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PaulEGLSurface
8542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
8552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
856adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
8592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
8612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
8632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
8652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
8672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
8682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
8692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
8702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
871adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
872adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
873adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
874adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
8762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
877adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
8802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
8812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
8822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
8852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
8872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
8882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
8892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
8902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_MODE_MESA, __FUNCTION__);
8912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
893adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
894adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
895adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
896adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8977012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
898adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
9002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
9017012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
9027012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9037012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9047012d01d888d482f2c6ad1180231a482026d213aJon SmirlEGLBoolean
9052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
9062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
9077012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
9082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
9092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
910adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
911adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
912adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
913adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
9142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
9152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
916adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
9172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
9182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
9192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
9212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
9232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
9242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
9252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf) != EGL_TRUE)
9272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      surf = NULL;
9282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surface)
9292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
9302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (surf != NULL);
931adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
932adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
933adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
934adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
9357012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
936adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
9372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
9382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
9392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
9412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
9432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
9442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
9452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenModeMESA(drv, disp, scrn, &m) != EGL_TRUE)
9472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      m = NULL;
9482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (mode)
9492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
9502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (m != NULL);
952adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
953adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
954adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9557012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char *
9567012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
9577012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
9582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
9592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryModeStringMESA(drv, disp, m);
9607012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
9617012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9627012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
9649061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
9659061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
966b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
967b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
968b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
969b2006a40eb22899d38cd31691640555228e36975Brian Paul
970b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
971b2006a40eb22899d38cd31691640555228e36975Brian Paul
972d5078b94323241a6482f54797756116b1c864327Brian Paul
973d5078b94323241a6482f54797756116b1c864327Brian Paul/**
974d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
975d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
976d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
977d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
978d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
979d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
980d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
981d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
982d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
983d5078b94323241a6482f54797756116b1c864327Brian Paul */
984b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
985b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
986b2006a40eb22899d38cd31691640555228e36975Brian Paul{
987b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
988b2006a40eb22899d38cd31691640555228e36975Brian Paul
98975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
99075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglBindAPI");
99175da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
99221b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
99321b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu      return _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
99421b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
995310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
996b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
997b2006a40eb22899d38cd31691640555228e36975Brian Paul}
998b2006a40eb22899d38cd31691640555228e36975Brian Paul
999b2006a40eb22899d38cd31691640555228e36975Brian Paul
1000d5078b94323241a6482f54797756116b1c864327Brian Paul/**
1001d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
1002d5078b94323241a6482f54797756116b1c864327Brian Paul */
1003d5078b94323241a6482f54797756116b1c864327Brian PaulEGLenum
1004d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
1005d5078b94323241a6482f54797756116b1c864327Brian Paul{
1006d5078b94323241a6482f54797756116b1c864327Brian Paul   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
1007d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
100821b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   return _eglConvertApiFromIndex(t->CurrentAPIIndex);
1009d5078b94323241a6482f54797756116b1c864327Brian Paul}
1010d5078b94323241a6482f54797756116b1c864327Brian Paul
1011d5078b94323241a6482f54797756116b1c864327Brian Paul
1012b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLSurface
1013b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
1014b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
1015b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
1016b2006a40eb22899d38cd31691640555228e36975Brian Paul{
10172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
10182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
10192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
10202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
10212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
10222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
10232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
10242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
10252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
10262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
10272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
10282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
10292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
10302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
10312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
1032b2006a40eb22899d38cd31691640555228e36975Brian Paul}
1033b2006a40eb22899d38cd31691640555228e36975Brian Paul
1034b2006a40eb22899d38cd31691640555228e36975Brian Paul
1035b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
1036b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
1037b2006a40eb22899d38cd31691640555228e36975Brian Paul{
103811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
10392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
104011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
104145ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      EGLint api_index = t->CurrentAPIIndex;
104211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      EGLint i;
104311cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu
104411cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      for (i = 0; i < _EGL_API_NUM_APIS; i++) {
104511cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         _EGLContext *ctx = t->CurrentContexts[i];
104611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         if (ctx) {
104711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDisplay *disp = ctx->Resource.Display;
104811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDriver *drv = disp->Driver;
104945ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu            t->CurrentAPIIndex = i;
105017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu            (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
105111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         }
10522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
105345ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu
105445ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu      t->CurrentAPIIndex = api_index;
1055b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
10562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
105775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1058b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
1059b2006a40eb22899d38cd31691640555228e36975Brian Paul}
10607012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10617012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1062b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
1063a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1064a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1065a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
1066a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1067a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1068a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WuEGLImageKHR
1069a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1070a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1071a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1072a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
1073a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1074a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1075a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1076a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1077a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   drv = _eglCheckDisplay(disp, __FUNCTION__);
1078a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!drv)
1079a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return EGL_NO_IMAGE_KHR;
1080a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT) {
1081a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
1082a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return EGL_NO_IMAGE_KHR;
1083a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   }
1084a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1085a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1086a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
1087a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (img)
1088a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return _eglLinkImage(img, disp);
1089a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   else
1090a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return EGL_NO_IMAGE_KHR;
1091a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1092a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1093a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1094a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WuEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
1095a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1096a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
1097a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1098a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1099a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1100a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   drv = _eglCheckDisplay(disp, __FUNCTION__);
1101a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!drv)
1102a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return EGL_FALSE;
1103a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1104a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return _eglError(EGL_BAD_PARAMETER, __FUNCTION__);
1105a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1106a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1107a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   return drv->API.DestroyImageKHR(drv, disp, img);
1108a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1109a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1110a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1111a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
1112