eglapi.c revision 0eaa02c836821556c1e8d0141f49f57e23f2548d
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
902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv->APImajor = major_int;
912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv->APIminor = minor_int;
922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      snprintf(drv->Version, sizeof(drv->Version),
932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               "%d.%d (%s)", major_int, minor_int, drv->Name);
942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = drv;
962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } else {
972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      major_int = drv->APImajor;
982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      minor_int = drv->APIminor;
99adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
1002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
1022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
1032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *major = major_int;
1042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *minor = minor_int;
1052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
108adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
109adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
110adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1111ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
112adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
113adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
1152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
1182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
1192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv) {
1222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      /* TODO drv->API.Terminate should be called here */
1232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglCloseDriver(drv, disp);
1242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = NULL;
1252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
1282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu/**
1322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu * A bunch of check functions and declare macros to simply error checking.
1332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu */
1342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
1362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp) {
1382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
1392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp->Driver) {
1422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
1432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return disp->Driver;
1462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
1512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf) {
1562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
1572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
160adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
161adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
162adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
1652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context) {
1702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
1712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
1742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
1792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!conf) {
1842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
1852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
1882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD(dpy)                                   \
1922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
1932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
1942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
1952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);              \
1962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
1972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
1982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
1992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface)              \
2022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface((surface), disp);     \
2042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckSurface(disp, surf, __FUNCTION__);        \
2072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx)                  \
2132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext((ctx), disp);      \
2152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckContext(disp, context, __FUNCTION__);     \
2182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#ifdef EGL_MESA_screen_surface
2242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
2282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!scrn) {
2332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
2342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
2422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m) {
2472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
2482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen)                \
2552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((screen), disp);        \
2572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckScreen(disp, scrn, __FUNCTION__);         \
2602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_MODE(dpy, mode)                    \
2662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode((mode), disp);                 \
2682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckMode(disp, m, __FUNCTION__);              \
2712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#endif /* EGL_MESA_screen_surface */
2772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2791ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
280adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
281adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
2822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
2832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryString(drv, disp, name);
284adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
285adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
286adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2871ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
2882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
2892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
290adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
293adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
294adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
295adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
2961ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
2972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
2982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
299adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
303adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
304adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
305adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3061ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
3082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
309adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
3172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
319adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
320adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
321adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
3232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
3242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
3252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
3262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
3292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
3312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
3352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!share && share_list != EGL_NO_CONTEXT) {
3362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
3372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
3382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
3412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (context)
3422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkContext(context, disp);
3432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
3442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
345adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
346adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
347adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3481ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
349adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
3522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
3532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroyContext(drv, disp, context);
354adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
355adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
356adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3571ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
3592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
360adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
3632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
3642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
3652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckDisplay(disp, __FUNCTION__);
3682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
3702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
3712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
3722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((!draw_surf && draw != EGL_NO_SURFACE) ||
3732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu       (!read_surf && read != EGL_NO_SURFACE))
3742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
3752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
378adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
379adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3801ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
3822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
383adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
3852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryContext(drv, disp, context, attribute, value);
386adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
387adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
388adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3891ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
3902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
3912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                       NativeWindowType window, const EGLint *attrib_list)
392adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
4032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
407adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
408adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
409adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4101ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
4122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                       NativePixmapType pixmap, const EGLint *attrib_list)
413adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
4242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
428adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
429adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
430adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4311ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
4332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
434adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
4452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
449adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
450adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
451adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
453adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
454adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
4572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroySurface(drv, disp, surf);
458adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
459adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
4622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
463adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QuerySurface(drv, disp, surf, attribute, value);
466adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
467adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
4702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
471adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
474adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
475adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
476adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4771ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
478adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
479adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.BindTexImage(drv, disp, surf, buffer);
482adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
483adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
484adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4851ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
486adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
487adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ReleaseTexImage(drv, disp, surf, buffer);
490adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
491adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
492adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
494adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
495adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
4972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SwapInterval(drv, disp, interval);
498adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
499adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
500adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5011ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
503adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SwapBuffers(drv, disp, surf);
506adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
507adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
508adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5091ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
510adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglCopyBuffers(EGLDisplay dpy, EGLSurface surface, NativePixmapType target)
511adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyBuffers(drv, disp, surf, target);
514adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
515adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
516adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5171ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
518adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitGL(void)
519adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
5212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
5242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
5252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
5272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
5282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitGL(drv, disp);
530adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
531adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
532adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5331ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
534adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
535adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
5372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
5402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
5412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
5432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
5442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitNative(drv, disp, engine);
546adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
547adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
548adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
550adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
551adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
552adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLDisplay *dpy = _eglGetCurrentDisplay();
553721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
554adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
555adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
556adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5571ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
558adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
560adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
5615e7dba541298a29f175f9d077bf6f63030465d94Brian Paul   return _eglGetContextHandle(ctx);
562adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
563adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
564adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5651ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
566adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
567adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
568adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLSurface *s = _eglGetCurrentSurface(readdraw);
569721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetSurfaceHandle(s);
570adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
571adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
572adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5731ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
574adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
575adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
57648822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
57748822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
57875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
57975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
580adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
581adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
582adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
583adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5841ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulvoid (* EGLAPIENTRY eglGetProcAddress(const char *procname))()
585adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
586adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   typedef void (*genericFunc)();
587adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   struct name_function {
588adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
591adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   static struct name_function egl_functions[] = {
592adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      /* alphabetical order */
593adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglBindTexImage", (_EGLProc) eglBindTexImage },
594adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglChooseConfig", (_EGLProc) eglChooseConfig },
595adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglCopyBuffers", (_EGLProc) eglCopyBuffers },
596adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglCreateContext", (_EGLProc) eglCreateContext },
597adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface },
598adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface },
599adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface },
600adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglDestroyContext", (_EGLProc) eglDestroyContext },
601adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglDestroySurface", (_EGLProc) eglDestroySurface },
602adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib },
603adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglGetConfigs", (_EGLProc) eglGetConfigs },
604adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext },
605adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay },
606adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface },
607adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglGetDisplay", (_EGLProc) eglGetDisplay },
608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglGetError", (_EGLProc) eglGetError },
609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglGetProcAddress", (_EGLProc) eglGetProcAddress },
610adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglInitialize", (_EGLProc) eglInitialize },
611adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglMakeCurrent", (_EGLProc) eglMakeCurrent },
612adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglQueryContext", (_EGLProc) eglQueryContext },
613adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglQueryString", (_EGLProc) eglQueryString },
614adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglQuerySurface", (_EGLProc) eglQuerySurface },
615adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage },
616adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglSurfaceAttrib", (_EGLProc) eglSurfaceAttrib },
617adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglSwapBuffers", (_EGLProc) eglSwapBuffers },
618adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglSwapInterval", (_EGLProc) eglSwapInterval },
619adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglTerminate", (_EGLProc) eglTerminate },
620adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglWaitGL", (_EGLProc) eglWaitGL },
621adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { "eglWaitNative", (_EGLProc) eglWaitNative },
622adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      /* Extensions */
623b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
6247012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
6257012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
6267012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
6271c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
6287012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
6297012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
63048822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
6317012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
6327012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
6337012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
6347012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
6357012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
636b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
637b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
638b2006a40eb22899d38cd31691640555228e36975Brian Paul      { "eglBindAPI", (_EGLProc) eglBindAPI },
639b2006a40eb22899d38cd31691640555228e36975Brian Paul      { "eglCreatePbufferFromClientBuffer", (_EGLProc) eglCreatePbufferFromClientBuffer },
640b2006a40eb22899d38cd31691640555228e36975Brian Paul      { "eglQueryAPI", (_EGLProc) eglQueryAPI },
641b2006a40eb22899d38cd31691640555228e36975Brian Paul      { "eglReleaseThread", (_EGLProc) eglReleaseThread },
642b2006a40eb22899d38cd31691640555228e36975Brian Paul      { "eglWaitClient", (_EGLProc) eglWaitClient },
643b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
644adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
645adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
646adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
647adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   for (i = 0; egl_functions[i].name; i++) {
648adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      if (strcmp(egl_functions[i].name, procname) == 0) {
649adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul         return (genericFunc) egl_functions[i].function;
650adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
651adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
652e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
653e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   /* now loop over drivers to query their procs */
654e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   for (i = 0; i < _eglGlobal.NumDrivers; i++) {
655e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul      _EGLProc p = _eglGlobal.Drivers[i]->API.GetProcAddress(procname);
656e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul      if (p)
657e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul         return p;
658e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   }
659e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
660adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return NULL;
661adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
662adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
663adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
664adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
665adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
666adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
667adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
669c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
670adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
671adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
672adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
6742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
6752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  modes, modes_size, num_modes);
676adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
677adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
678adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6791ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
6812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
682adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
6842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
685adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
686adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
687adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6881ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
6902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
691adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
6932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
694adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
695adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
696adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6971ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
6982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
6992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
7002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
7012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
7032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
7042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckContext(disp, source_context, __FUNCTION__);
7072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv || !dest_context) {
7082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (drv)
7092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
7101c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      return EGL_FALSE;
7112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
7122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyContextMESA(drv, disp, source_context, dest_context,
7142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                   mask);
7151c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
7161c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
7171c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
718adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
7202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
721adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
7232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetScreensMESA(drv, disp, screens,
7242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  max_screens, num_screens);
725adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
726adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
727adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
728c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PaulEGLSurface
7292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
7302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
731adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
7342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
7362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
7382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
7402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
7422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
7432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
7442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
7452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
746adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
747adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
748adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
749adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
7512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
752adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
7552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
7562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
7572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
7602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
7622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
7632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
7642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
7652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_MODE_MESA, __FUNCTION__);
7662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
768adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
769adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
770adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
771adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7727012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
773adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
7767012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
7777012d01d888d482f2c6ad1180231a482026d213aJon Smirl
7787012d01d888d482f2c6ad1180231a482026d213aJon Smirl
7797012d01d888d482f2c6ad1180231a482026d213aJon SmirlEGLBoolean
7802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
7812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
7827012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
7832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
785adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
786adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
787adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
788adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
7902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
791adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
7942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
7962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
7982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
7992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
8002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf) != EGL_TRUE)
8022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      surf = NULL;
8032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surface)
8042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
8052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (surf != NULL);
806adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
807adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
808adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
809adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8107012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
811adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
8142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
8162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
8182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
8202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenModeMESA(drv, disp, scrn, &m) != EGL_TRUE)
8222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      m = NULL;
8232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (mode)
8242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
8252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (m != NULL);
827adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
828adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
829adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8307012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char *
8317012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
8327012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
8332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
8342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryModeStringMESA(drv, disp, m);
8357012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
8367012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8377012d01d888d482f2c6ad1180231a482026d213aJon Smirl
838b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
839b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
840b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
841b2006a40eb22899d38cd31691640555228e36975Brian Paul
842b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
843b2006a40eb22899d38cd31691640555228e36975Brian Paul
844d5078b94323241a6482f54797756116b1c864327Brian Paul
845d5078b94323241a6482f54797756116b1c864327Brian Paul/**
846d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
847d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
848d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
849d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
850d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
851d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
852d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
853d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
854d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
855d5078b94323241a6482f54797756116b1c864327Brian Paul */
856b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
857b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
858b2006a40eb22899d38cd31691640555228e36975Brian Paul{
859b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
860b2006a40eb22899d38cd31691640555228e36975Brian Paul
86175da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
86275da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglBindAPI");
86375da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
86421b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
86521b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu      return _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
86621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
867b2006a40eb22899d38cd31691640555228e36975Brian Paul   switch (api) {
8685f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul#ifdef EGL_VERSION_1_4
8695f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul   case EGL_OPENGL_API:
870d5078b94323241a6482f54797756116b1c864327Brian Paul      if (_eglGlobal.ClientAPIsMask & EGL_OPENGL_BIT) {
87121b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
8725f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul         return EGL_TRUE;
8735f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul      }
8745f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
8755f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul      return EGL_FALSE;
8765f8a4f3e5e8fe78f1abe9ca6dd1131ad53d3d943Brian Paul#endif
877b2006a40eb22899d38cd31691640555228e36975Brian Paul   case EGL_OPENGL_ES_API:
878d5078b94323241a6482f54797756116b1c864327Brian Paul      if (_eglGlobal.ClientAPIsMask & (EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT)) {
87921b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
880b2006a40eb22899d38cd31691640555228e36975Brian Paul         return EGL_TRUE;
881b2006a40eb22899d38cd31691640555228e36975Brian Paul      }
882b2006a40eb22899d38cd31691640555228e36975Brian Paul      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
883b2006a40eb22899d38cd31691640555228e36975Brian Paul      return EGL_FALSE;
884b2006a40eb22899d38cd31691640555228e36975Brian Paul   case EGL_OPENVG_API:
885d5078b94323241a6482f54797756116b1c864327Brian Paul      if (_eglGlobal.ClientAPIsMask & EGL_OPENVG_BIT) {
88621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
887b2006a40eb22899d38cd31691640555228e36975Brian Paul         return EGL_TRUE;
888b2006a40eb22899d38cd31691640555228e36975Brian Paul      }
889b2006a40eb22899d38cd31691640555228e36975Brian Paul      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
890b2006a40eb22899d38cd31691640555228e36975Brian Paul      return EGL_FALSE;
891b2006a40eb22899d38cd31691640555228e36975Brian Paul   default:
892b2006a40eb22899d38cd31691640555228e36975Brian Paul      return EGL_FALSE;
893b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
894b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
895b2006a40eb22899d38cd31691640555228e36975Brian Paul}
896b2006a40eb22899d38cd31691640555228e36975Brian Paul
897b2006a40eb22899d38cd31691640555228e36975Brian Paul
898d5078b94323241a6482f54797756116b1c864327Brian Paul/**
899d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
900d5078b94323241a6482f54797756116b1c864327Brian Paul */
901d5078b94323241a6482f54797756116b1c864327Brian PaulEGLenum
902d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
903d5078b94323241a6482f54797756116b1c864327Brian Paul{
904d5078b94323241a6482f54797756116b1c864327Brian Paul   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
905d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
90621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   return _eglConvertApiFromIndex(t->CurrentAPIIndex);
907d5078b94323241a6482f54797756116b1c864327Brian Paul}
908d5078b94323241a6482f54797756116b1c864327Brian Paul
909d5078b94323241a6482f54797756116b1c864327Brian Paul
910b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLSurface
911b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
912b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
913b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
914b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
9162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
9172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
9192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
9212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
9222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
9232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
9252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
9262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
9272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
9282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
9292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
930b2006a40eb22899d38cd31691640555228e36975Brian Paul}
931b2006a40eb22899d38cd31691640555228e36975Brian Paul
932b2006a40eb22899d38cd31691640555228e36975Brian Paul
933b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
934b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
935b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* unbind current context */
9372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
9382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _EGLDisplay *disp = _eglGetCurrentDisplay();
9392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _EGLDriver *drv;
9402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (disp) {
9412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         drv = disp->Driver;
9422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
9432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
944b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
9452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
94675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
947b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
948b2006a40eb22899d38cd31691640555228e36975Brian Paul}
9497012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9507012d01d888d482f2c6ad1180231a482026d213aJon Smirl
951b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
952b2006a40eb22899d38cd31691640555228e36975Brian PauleglWaitClient(void)
953b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglGetCurrentDisplay();
9552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
9582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
9592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* a current display is always initialized */
9612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
9622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitClient(drv, disp);
964b2006a40eb22899d38cd31691640555228e36975Brian Paul}
9657012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
967b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
968