eglapi.c revision 9061d733d3f31293c145cf3b7a0f71c1bfd31989
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
12adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * opaque handles implemented with 32-bit unsigned integers.
13adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * It's up to the driver function or fallback function to look up the
14adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * handle and get an object.
15adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * By using opaque handles, we leave open the possibility of having
16adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * indirect rendering in the future, like GLX.
17adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
18adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
19adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Notes on naming conventions:
20adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
21adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * eglFooBar    - public EGL function
22adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_FOO_BAR  - public EGL token
23adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGLDatatype  - public EGL datatype
24adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
25adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _eglFooBar   - private EGL function
26adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _EGLDatatype - private EGL datatype, typedef'd struct
27adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _egl_struct  - private EGL struct, non-typedef'd
28adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul *
29adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
30adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
31adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
32adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <stdio.h>
33b2006a40eb22899d38cd31691640555228e36975Brian Paul#include <stdlib.h>
34adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <string.h>
35adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h"
36adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h"
37adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
38adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglglobals.h"
39adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
40adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h"
432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h"
44adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
45adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
46adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
476052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
486052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * We initialize our global vars and create a private _EGLDisplay object.
49adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
501ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
516052af172f0241e6678cd16efac0a0f14f40146cBrian PauleglGetDisplay(NativeDisplayType nativeDisplay)
52adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
53adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLDisplay *dpy;
54be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   dpy = _eglFindDisplay(nativeDisplay);
55be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   if (!dpy) {
56be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu      dpy = _eglNewDisplay(nativeDisplay);
57be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu      if (dpy)
58be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu         _eglLinkDisplay(dpy);
59be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   }
60721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
61adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
62adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
63adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
646052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
656052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
666052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
676052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
69adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
70adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
737e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White   EGLint major_int, minor_int;
747e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv) {
800eaa02c836821556c1e8d0141f49f57e23f2548dChia-I Wu      drv = _eglOpenDriver(disp);
812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)
822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      /* Initialize the particular display now */
852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv->API.Initialize(drv, disp, &major_int, &minor_int)) {
862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         _eglCloseDriver(drv, disp);
872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
887e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White      }
89c56e15b093c367e7e17ebd2e153baab8cafd213aBrian Paul
905a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APImajor = major_int;
915a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APIminor = minor_int;
925a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      snprintf(disp->Version, sizeof(disp->Version),
932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               "%d.%d (%s)", major_int, minor_int, drv->Name);
942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
955a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      /* update the global notion of supported APIs */
965a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      _eglGlobal.ClientAPIsMask |= disp->ClientAPIsMask;
975a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu
982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = drv;
992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } else {
1005a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      major_int = disp->APImajor;
1015a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      minor_int = disp->APIminor;
102adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
1032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
1052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
1062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *major = major_int;
1072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *minor = minor_int;
1082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
111adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
112adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
113adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1141ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
115adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
116adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
1182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
1212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
1222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv) {
125ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
1262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglCloseDriver(drv, disp);
1272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = NULL;
1282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
1312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu/**
1352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu * A bunch of check functions and declare macros to simply error checking.
1362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu */
1372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
1392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp) {
1412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
1422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp->Driver) {
1452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
1462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return disp->Driver;
1492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
1542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf) {
1592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
1602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
163adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
164adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
165adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
1682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context) {
1732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
1742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
1772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
1822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!conf) {
1872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
1882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
1912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD(dpy)                                   \
1952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
1962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
1972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
1982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);              \
1992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface)              \
2052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface((surface), disp);     \
2072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckSurface(disp, surf, __FUNCTION__);        \
2102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx)                  \
2162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext((ctx), disp);      \
2182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckContext(disp, context, __FUNCTION__);     \
2212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#ifdef EGL_MESA_screen_surface
2272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
2312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!scrn) {
2362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
2372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
2452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m) {
2502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
2512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen)                \
2582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((screen), disp);        \
2602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckScreen(disp, scrn, __FUNCTION__);         \
2632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_MODE(dpy, mode)                    \
2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode((mode), disp);                 \
2712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckMode(disp, m, __FUNCTION__);              \
2742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#endif /* EGL_MESA_screen_surface */
2802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2821ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
283adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
284adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
2852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
2862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryString(drv, disp, name);
287adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
288adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
289adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2901ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
293adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
2942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
2952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
296adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
297adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
298adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2991ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
302adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
306adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
307adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
308adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3091ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
3112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
312adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
3202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
322adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
323adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
324adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3251ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
3262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
3292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
3322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
3342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
3382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!share && share_list != EGL_NO_CONTEXT) {
3392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
3402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
3412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
3442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (context)
3452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkContext(context, disp);
3462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
3472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
348adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
349adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3511ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
352adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
353adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
3552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
3562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroyContext(drv, disp, context);
357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
358adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
359adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
3622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
363adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
3662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
3672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
3682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckDisplay(disp, __FUNCTION__);
3712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
3732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
3742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
3752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((!draw_surf && draw != EGL_NO_SURFACE) ||
3762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu       (!read_surf && read != EGL_NO_SURFACE))
3772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
3782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
380adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
381adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
382adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3831ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
3852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
386adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
3882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryContext(drv, disp, context, attribute, value);
389adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
390adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
391adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3921ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
3932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
3942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                       NativeWindowType window, const EGLint *attrib_list)
395adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
4062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
410adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
411adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
412adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
4152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                       NativePixmapType pixmap, const EGLint *attrib_list)
416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
4272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
431adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
432adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
433adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4341ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
4362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
437adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
4482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
452adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
453adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
454adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4551ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
456adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
457adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
4602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroySurface(drv, disp, surf);
461adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
462adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
4652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
466adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QuerySurface(drv, disp, surf, attribute, value);
469adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
470adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4711ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
4732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
474adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
477adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
478adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
479adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4801ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
481adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
482adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.BindTexImage(drv, disp, surf, buffer);
485adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
486adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
487adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4881ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
489adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
490adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ReleaseTexImage(drv, disp, surf, buffer);
493adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
494adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
495adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4961ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
497adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
498adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
5002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SwapInterval(drv, disp, interval);
501adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
502adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
503adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5041ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
506adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SwapBuffers(drv, disp, surf);
509adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
510adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
511adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
513adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglCopyBuffers(EGLDisplay dpy, EGLSurface surface, NativePixmapType target)
514adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyBuffers(drv, disp, surf, target);
517adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
518adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
519adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5201ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
521adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitGL(void)
522adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
5242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
5272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
5282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
5302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
5312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitGL(drv, disp);
533adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
534adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
535adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5361ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
537adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
538adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
5402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
5432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
5442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
5462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
5472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitNative(drv, disp, engine);
549adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
550adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
551adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
553adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
554adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
555adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLDisplay *dpy = _eglGetCurrentDisplay();
556721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
557adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
558adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
561adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
562adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
563adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
5645e7dba541298a29f175f9d077bf6f63030465d94Brian Paul   return _eglGetContextHandle(ctx);
565adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
566adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
567adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
569adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
570adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
571adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLSurface *s = _eglGetCurrentSurface(readdraw);
572721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetSurfaceHandle(s);
573adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
574adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
575adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
577adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
578adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
57948822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
58048822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
58175da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
58275da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
583adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
584adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
585adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
586adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5871ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulvoid (* EGLAPIENTRY eglGetProcAddress(const char *procname))()
588adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5899061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
591adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
5929061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
5939061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      /* extensions only */
594b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
5957012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
5967012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
5977012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
5981c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
5997012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
6007012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
60148822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
6027012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
6037012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
6047012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
6057012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
6067012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
607b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
610adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
6119061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
6129061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
6139061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      return NULL;
6149061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
6159061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
6169061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0)
6179061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu            return egl_functions[i].function;
618adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
619adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
620e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
621e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   /* now loop over drivers to query their procs */
622e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   for (i = 0; i < _eglGlobal.NumDrivers; i++) {
623e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul      _EGLProc p = _eglGlobal.Drivers[i]->API.GetProcAddress(procname);
624e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul      if (p)
625e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul         return p;
626e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   }
627e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
628adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return NULL;
629adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
630adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
631adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6329061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
6339061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
6349061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
635adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
636adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
637adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
638adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6391ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
640c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
641adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
642adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
643adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
6452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
6462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  modes, modes_size, num_modes);
647adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
648adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
649adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6501ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
6522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
653adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
6552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
656adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
657adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
658adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6591ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
6612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
662adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
6642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
665adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
666adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
667adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
6702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
6712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
6722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
6732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
6742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
6752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
6762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckContext(disp, source_context, __FUNCTION__);
6782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv || !dest_context) {
6792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (drv)
6802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
6811c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      return EGL_FALSE;
6822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
6832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyContextMESA(drv, disp, source_context, dest_context,
6852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                   mask);
6861c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
6871c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
6881c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
689adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
6902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
6912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
692adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
6942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetScreensMESA(drv, disp, screens,
6952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  max_screens, num_screens);
696adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
697adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
698adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
699c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PaulEGLSurface
7002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
7012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
702adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
7052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
7072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
7092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
7112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
7132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
7142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
7152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
7162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
717adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
718adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
719adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
720adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
7222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
723adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
7262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
7272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
7282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
7312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
7332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
7342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
7352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
7362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_MODE_MESA, __FUNCTION__);
7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
739adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
740adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
741adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
742adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7437012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
744adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
7477012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
7487012d01d888d482f2c6ad1180231a482026d213aJon Smirl
7497012d01d888d482f2c6ad1180231a482026d213aJon Smirl
7507012d01d888d482f2c6ad1180231a482026d213aJon SmirlEGLBoolean
7512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
7522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
7537012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
7542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
756adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
757adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
758adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
759adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
7612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
762adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
7652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
7672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
7692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
7712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf) != EGL_TRUE)
7732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      surf = NULL;
7742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surface)
7752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
7762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (surf != NULL);
777adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
778adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
779adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
780adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7817012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
782adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
7852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
7872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
7892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
7912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenModeMESA(drv, disp, scrn, &m) != EGL_TRUE)
7932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      m = NULL;
7942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (mode)
7952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
7962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (m != NULL);
798adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
799adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
800adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8017012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char *
8027012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
8037012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
8042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
8052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryModeStringMESA(drv, disp, m);
8067012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
8077012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8087012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8099061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
8109061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
8119061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
812b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
813b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
814b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
815b2006a40eb22899d38cd31691640555228e36975Brian Paul
816b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
817b2006a40eb22899d38cd31691640555228e36975Brian Paul
818d5078b94323241a6482f54797756116b1c864327Brian Paul
819d5078b94323241a6482f54797756116b1c864327Brian Paul/**
820d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
821d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
822d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
823d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
824d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
825d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
826d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
827d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
828d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
829d5078b94323241a6482f54797756116b1c864327Brian Paul */
830b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
831b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
832b2006a40eb22899d38cd31691640555228e36975Brian Paul{
833b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
834b2006a40eb22899d38cd31691640555228e36975Brian Paul
83575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
83675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglBindAPI");
83775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
83821b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
83921b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu      return _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
84021b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
841b2006a40eb22899d38cd31691640555228e36975Brian Paul   switch (api) {
8425f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul#ifdef EGL_VERSION_1_4
8435f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul   case EGL_OPENGL_API:
844d5078b94323241a6482f54797756116b1c864327Brian Paul      if (_eglGlobal.ClientAPIsMask & EGL_OPENGL_BIT) {
84521b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
8465f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul         return EGL_TRUE;
8475f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul      }
8485f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
8495f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul      return EGL_FALSE;
8505f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul#endif
851b2006a40eb22899d38cd31691640555228e36975Brian Paul   case EGL_OPENGL_ES_API:
852d5078b94323241a6482f54797756116b1c864327Brian Paul      if (_eglGlobal.ClientAPIsMask & (EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT)) {
85321b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
854b2006a40eb22899d38cd31691640555228e36975Brian Paul         return EGL_TRUE;
855b2006a40eb22899d38cd31691640555228e36975Brian Paul      }
856b2006a40eb22899d38cd31691640555228e36975Brian Paul      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
857b2006a40eb22899d38cd31691640555228e36975Brian Paul      return EGL_FALSE;
858b2006a40eb22899d38cd31691640555228e36975Brian Paul   case EGL_OPENVG_API:
859d5078b94323241a6482f54797756116b1c864327Brian Paul      if (_eglGlobal.ClientAPIsMask & EGL_OPENVG_BIT) {
86021b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
861b2006a40eb22899d38cd31691640555228e36975Brian Paul         return EGL_TRUE;
862b2006a40eb22899d38cd31691640555228e36975Brian Paul      }
863b2006a40eb22899d38cd31691640555228e36975Brian Paul      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
864b2006a40eb22899d38cd31691640555228e36975Brian Paul      return EGL_FALSE;
865b2006a40eb22899d38cd31691640555228e36975Brian Paul   default:
866b2006a40eb22899d38cd31691640555228e36975Brian Paul      return EGL_FALSE;
867b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
868b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
869b2006a40eb22899d38cd31691640555228e36975Brian Paul}
870b2006a40eb22899d38cd31691640555228e36975Brian Paul
871b2006a40eb22899d38cd31691640555228e36975Brian Paul
872d5078b94323241a6482f54797756116b1c864327Brian Paul/**
873d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
874d5078b94323241a6482f54797756116b1c864327Brian Paul */
875d5078b94323241a6482f54797756116b1c864327Brian PaulEGLenum
876d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
877d5078b94323241a6482f54797756116b1c864327Brian Paul{
878d5078b94323241a6482f54797756116b1c864327Brian Paul   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
879d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
88021b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   return _eglConvertApiFromIndex(t->CurrentAPIIndex);
881d5078b94323241a6482f54797756116b1c864327Brian Paul}
882d5078b94323241a6482f54797756116b1c864327Brian Paul
883d5078b94323241a6482f54797756116b1c864327Brian Paul
884b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLSurface
885b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
886b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
887b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
888b2006a40eb22899d38cd31691640555228e36975Brian Paul{
8892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
8912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
8932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
8952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
8972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
8992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
9002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
9012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
9022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
9032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
904b2006a40eb22899d38cd31691640555228e36975Brian Paul}
905b2006a40eb22899d38cd31691640555228e36975Brian Paul
906b2006a40eb22899d38cd31691640555228e36975Brian Paul
907b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
908b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
909b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* unbind current context */
9112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
9122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _EGLDisplay *disp = _eglGetCurrentDisplay();
9132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _EGLDriver *drv;
9142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (disp) {
9152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         drv = disp->Driver;
9162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
9172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
918b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
9192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
92075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
921b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
922b2006a40eb22899d38cd31691640555228e36975Brian Paul}
9237012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9247012d01d888d482f2c6ad1180231a482026d213aJon Smirl
925b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
926b2006a40eb22899d38cd31691640555228e36975Brian PauleglWaitClient(void)
927b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
9292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
9322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
9332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
9352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
9362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitClient(drv, disp);
938b2006a40eb22899d38cd31691640555228e36975Brian Paul}
9397012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
941b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
942