eglapi.c revision 57da499d7ba074128e8c97b8076805e403a2b9c4
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"
63adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h"
64adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h"
652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h"
662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h"
672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h"
68adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
69adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
70adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
716052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
726052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * We initialize our global vars and create a private _EGLDisplay object.
73adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
741ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
756052af172f0241e6678cd16efac0a0f14f40146cBrian PauleglGetDisplay(NativeDisplayType nativeDisplay)
76adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
77adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLDisplay *dpy;
78be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   dpy = _eglFindDisplay(nativeDisplay);
79be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   if (!dpy) {
80be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu      dpy = _eglNewDisplay(nativeDisplay);
81be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu      if (dpy)
82be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu         _eglLinkDisplay(dpy);
83be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   }
84721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
85adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
86adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
87adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
886052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
896052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
906052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
916052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
921ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
93adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
94adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
977e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White   EGLint major_int, minor_int;
987e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
1002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
1012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv) {
1040eaa02c836821556c1e8d0141f49f57e23f2548dChia-I Wu      drv = _eglOpenDriver(disp);
1052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)
1062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
1072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      /* Initialize the particular display now */
1092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv->API.Initialize(drv, disp, &major_int, &minor_int)) {
1102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         _eglCloseDriver(drv, disp);
1112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
1127e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White      }
113c56e15b093c367e7e17ebd2e153baab8cafd213aBrian Paul
1145a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APImajor = major_int;
1155a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APIminor = minor_int;
1165a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      snprintf(disp->Version, sizeof(disp->Version),
1172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               "%d.%d (%s)", major_int, minor_int, drv->Name);
1182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
119310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
120310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      disp->ClientAPIsMask &= _EGL_API_ALL_BITS;
1215a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu
1222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = drv;
1232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } else {
1245a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      major_int = disp->APImajor;
1255a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      minor_int = disp->APIminor;
126adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
1272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
1292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
1302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *major = major_int;
1312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *minor = minor_int;
1322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
135adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
136adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
137adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1381ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
139adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
140adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
1422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
1452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
1462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv) {
149ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
1502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglCloseDriver(drv, disp);
1512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = NULL;
1522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
1552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu/**
1592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu * A bunch of check functions and declare macros to simply error checking.
1602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu */
1612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
1632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp) {
1652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
1662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp->Driver) {
1692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
1702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return disp->Driver;
1732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
1782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf) {
1832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
1842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
187adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
188adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
189adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
1922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context) {
1972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
1982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
2062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!conf) {
2112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
2122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD(dpy)                                   \
2192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);              \
2232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface)              \
2292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface((surface), disp);     \
2312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckSurface(disp, surf, __FUNCTION__);        \
2342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx)                  \
2402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext((ctx), disp);      \
2422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckContext(disp, context, __FUNCTION__);     \
2452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#ifdef EGL_MESA_screen_surface
2512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
2552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!scrn) {
2602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
2612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m) {
2742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
2752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen)                \
2822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((screen), disp);        \
2842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckScreen(disp, scrn, __FUNCTION__);         \
2872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_MODE(dpy, mode)                    \
2932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode((mode), disp);                 \
2952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckMode(disp, m, __FUNCTION__);              \
2982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
3002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
3012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#endif /* EGL_MESA_screen_surface */
3042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3061ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
307adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
308adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryString(drv, disp, name);
311adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
312adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
313adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3141ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
3162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
317adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
320adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
321adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
322adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3231ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
326adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
330adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
331adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
332adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3331ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
3352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
336adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
3442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
346adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
347adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
348adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
3502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
3512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
3522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
3532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
3562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
3582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
3622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!share && share_list != EGL_NO_CONTEXT) {
3632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
3642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
3652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
3682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (context)
3692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkContext(context, disp);
3702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
3712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
372adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
373adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
374adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3751ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
376adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
3792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
3802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroyContext(drv, disp, context);
381adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
382adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
383adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3841ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
3862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
387adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
3902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
3912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
3922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckDisplay(disp, __FUNCTION__);
3952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
3982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((!draw_surf && draw != EGL_NO_SURFACE) ||
4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu       (!read_surf && read != EGL_NO_SURFACE))
4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
4022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
404adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
405adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
406adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4071ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
4092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
410adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
4122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryContext(drv, disp, context, attribute, value);
413adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
414adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
415adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4161ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
4182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                       NativeWindowType window, const EGLint *attrib_list)
419adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
4302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
434adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
435adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
436adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4371ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
4392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                       NativePixmapType pixmap, const EGLint *attrib_list)
440adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
4512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
455adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
456adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
457adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4581ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
4602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
461adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
4722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
476adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
477adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
478adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4791ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
480adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
481adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
4842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroySurface(drv, disp, surf);
485adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
486adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4871ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
4892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
490adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QuerySurface(drv, disp, surf, attribute, value);
493adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
494adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4951ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
4972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
498adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
501adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
502adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
503adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5041ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
505adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
506adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.BindTexImage(drv, disp, surf, buffer);
509adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
510adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
511adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
513adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
514adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ReleaseTexImage(drv, disp, surf, buffer);
517adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
518adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
519adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5201ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
521adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
522adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
52357da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
52457da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
5252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
52657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
52757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || ctx->Display != disp)
52857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu      return _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
52957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
53057da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
53157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   if (!_eglIsSurfaceLinked(surf))
53257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
53357da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
53457da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   return drv->API.SwapInterval(drv, disp, surf, interval);
535adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
536adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
537adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5381ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
540adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
541bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
543bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
544bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
545bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
546bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
547bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
5482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SwapBuffers(drv, disp, surf);
549adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
550adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
551adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
553adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglCopyBuffers(EGLDisplay dpy, EGLSurface surface, NativePixmapType target)
554adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyBuffers(drv, disp, surf, target);
557adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
558adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
561adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitGL(void)
562adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
5642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
5672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
5682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
5702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
5712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitGL(drv, disp);
573adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
574adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
575adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
577adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
578adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
5802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
5832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
5842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
5862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
5872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitNative(drv, disp, engine);
589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
591adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5921ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
593adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
594adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
595adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLDisplay *dpy = _eglGetCurrentDisplay();
596721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
597adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
598adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
599adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6001ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
601adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
602adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
603adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
6045e7dba541298a29f175f9d077bf6f63030465d94Brian Paul   return _eglGetContextHandle(ctx);
605adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
606adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
607adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6081ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
610adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
61161906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
61261906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
61361906631202af855d0742586956ff9f34522a525Chia-I Wu
61461906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
61561906631202af855d0742586956ff9f34522a525Chia-I Wu      return EGL_NO_SURFACE;
61661906631202af855d0742586956ff9f34522a525Chia-I Wu
61761906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
61861906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
61961906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
62061906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
62161906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
62261906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
62361906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
62461906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
62561906631202af855d0742586956ff9f34522a525Chia-I Wu      _eglError(EGL_BAD_PARAMETER, __FUNCTION__);
62661906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
62761906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
62861906631202af855d0742586956ff9f34522a525Chia-I Wu   }
62961906631202af855d0742586956ff9f34522a525Chia-I Wu
63061906631202af855d0742586956ff9f34522a525Chia-I Wu   return _eglGetSurfaceHandle(surf);
631adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
632adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
633adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6341ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
635adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
636adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
63748822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
63848822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
63975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
64075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
641adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
642adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
643adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
644adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6451ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulvoid (* EGLAPIENTRY eglGetProcAddress(const char *procname))()
646adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6479061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
648adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
649adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
6509061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
6519061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      /* extensions only */
652b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
6537012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
6547012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
6557012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
6561c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
6577012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
6587012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
65948822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
6607012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
6617012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
6627012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
6637012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
6647012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
665b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
666adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
667adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
668adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
6699061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
6709061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
6719061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      return NULL;
6729061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
6739061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
6749061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0)
6759061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu            return egl_functions[i].function;
676adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
677adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
678e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
679e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu   /* preload a driver if there isn't one */
680e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu   if (!_eglGlobal.NumDrivers)
681e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu      _eglPreloadDriver(NULL);
682e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu
683e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   /* now loop over drivers to query their procs */
684e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   for (i = 0; i < _eglGlobal.NumDrivers; i++) {
685e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul      _EGLProc p = _eglGlobal.Drivers[i]->API.GetProcAddress(procname);
686e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul      if (p)
687e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul         return p;
688e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   }
689e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
690adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return NULL;
691adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
692adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
693adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6949061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
6959061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
6969061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
697adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
698adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
699adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
700adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7011ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
702c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
703adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
704adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
705adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
7082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  modes, modes_size, num_modes);
709adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
710adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
711adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
7142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
715adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
718adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
719adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
720adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7211ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
7232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
724adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
7262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
727adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
728adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
729adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7301ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
7322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
7332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
7342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
7362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckContext(disp, source_context, __FUNCTION__);
7402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv || !dest_context) {
7412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (drv)
7422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
7431c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      return EGL_FALSE;
7442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
7452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyContextMESA(drv, disp, source_context, dest_context,
7472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                   mask);
7481c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
7491c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
7501c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
751adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
7532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
754adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
7562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetScreensMESA(drv, disp, screens,
7572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  max_screens, num_screens);
758adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
759adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
761c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PaulEGLSurface
7622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
7632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
764adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
7672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
7692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
7712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
7732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
7752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
7762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
7772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
7782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
779adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
780adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
781adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
782adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
7842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
785adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
7882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
7892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
7902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
7932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
7952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
7962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
7972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
7982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_MODE_MESA, __FUNCTION__);
7992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
801adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
802adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
803adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
804adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8057012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
806adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
8082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
8097012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
8107012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8117012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8127012d01d888d482f2c6ad1180231a482026d213aJon SmirlEGLBoolean
8132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
8142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
8157012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
8162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
8172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
818adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
819adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
820adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
821adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
8232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
824adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
8272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
8292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
8312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
8332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf) != EGL_TRUE)
8352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      surf = NULL;
8362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surface)
8372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
8382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (surf != NULL);
839adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
840adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
841adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
842adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8437012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
844adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
8472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
8492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
8512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
8532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenModeMESA(drv, disp, scrn, &m) != EGL_TRUE)
8552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      m = NULL;
8562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (mode)
8572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
8582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (m != NULL);
860adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
861adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
862adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8637012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char *
8647012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
8657012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
8662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
8672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryModeStringMESA(drv, disp, m);
8687012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
8697012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8707012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8719061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
8729061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
8739061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
874b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
875b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
876b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
877b2006a40eb22899d38cd31691640555228e36975Brian Paul
878b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
879b2006a40eb22899d38cd31691640555228e36975Brian Paul
880d5078b94323241a6482f54797756116b1c864327Brian Paul
881d5078b94323241a6482f54797756116b1c864327Brian Paul/**
882d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
883d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
884d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
885d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
886d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
887d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
888d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
889d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
890d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
891d5078b94323241a6482f54797756116b1c864327Brian Paul */
892b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
893b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
894b2006a40eb22899d38cd31691640555228e36975Brian Paul{
895b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
896b2006a40eb22899d38cd31691640555228e36975Brian Paul
89775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
89875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglBindAPI");
89975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
90021b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
90121b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu      return _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
90221b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
903310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
904b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
905b2006a40eb22899d38cd31691640555228e36975Brian Paul}
906b2006a40eb22899d38cd31691640555228e36975Brian Paul
907b2006a40eb22899d38cd31691640555228e36975Brian Paul
908d5078b94323241a6482f54797756116b1c864327Brian Paul/**
909d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
910d5078b94323241a6482f54797756116b1c864327Brian Paul */
911d5078b94323241a6482f54797756116b1c864327Brian PaulEGLenum
912d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
913d5078b94323241a6482f54797756116b1c864327Brian Paul{
914d5078b94323241a6482f54797756116b1c864327Brian Paul   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
915d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
91621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   return _eglConvertApiFromIndex(t->CurrentAPIIndex);
917d5078b94323241a6482f54797756116b1c864327Brian Paul}
918d5078b94323241a6482f54797756116b1c864327Brian Paul
919d5078b94323241a6482f54797756116b1c864327Brian Paul
920b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLSurface
921b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
922b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
923b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
924b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
9262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
9272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
9292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
9312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
9322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
9332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
9352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
9362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
9372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
9382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
9392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
940b2006a40eb22899d38cd31691640555228e36975Brian Paul}
941b2006a40eb22899d38cd31691640555228e36975Brian Paul
942b2006a40eb22899d38cd31691640555228e36975Brian Paul
943b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
944b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
945b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* unbind current context */
9472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
9482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _EGLDisplay *disp = _eglGetCurrentDisplay();
9492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _EGLDriver *drv;
9502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (disp) {
9512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         drv = disp->Driver;
9522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
9532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
954b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
9552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
95675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
957b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
958b2006a40eb22899d38cd31691640555228e36975Brian Paul}
9597012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9607012d01d888d482f2c6ad1180231a482026d213aJon Smirl
961b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
962b2006a40eb22899d38cd31691640555228e36975Brian PauleglWaitClient(void)
963b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
9652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
9682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
9692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
9712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
9722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitClient(drv, disp);
974b2006a40eb22899d38cd31691640555228e36975Brian Paul}
9757012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
977b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
978