eglapi.c revision 11cf3cb2c463cf8af8a7e63eb9521979bfd303f8
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"
68a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h"
69adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
70adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
71adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/**
726052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls.
736052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * We initialize our global vars and create a private _EGLDisplay object.
74adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
751ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
764aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay)
77adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
78adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLDisplay *dpy;
79be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   dpy = _eglFindDisplay(nativeDisplay);
80be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   if (!dpy) {
81be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu      dpy = _eglNewDisplay(nativeDisplay);
82be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu      if (dpy)
83be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu         _eglLinkDisplay(dpy);
84be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu   }
85721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
86adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
87adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
88adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
896052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/**
906052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls.
916052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver.
926052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */
931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
94adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
95adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
987e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White   EGLint major_int, minor_int;
997e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White
1002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
1012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
1022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv) {
10557929eda3e876dc60be7060237a669f042be2376Chia-I Wu      _eglPreloadDrivers();
10657929eda3e876dc60be7060237a669f042be2376Chia-I Wu
1070eaa02c836821556c1e8d0141f49f57e23f2548dChia-I Wu      drv = _eglOpenDriver(disp);
1082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)
1092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
1102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      /* Initialize the particular display now */
1122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv->API.Initialize(drv, disp, &major_int, &minor_int)) {
1132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         _eglCloseDriver(drv, disp);
1142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__);
1157e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White      }
116c56e15b093c367e7e17ebd2e153baab8cafd213aBrian Paul
1175a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APImajor = major_int;
1185a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      disp->APIminor = minor_int;
1195a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      snprintf(disp->Version, sizeof(disp->Version),
1202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               "%d.%d (%s)", major_int, minor_int, drv->Name);
1212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
122310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      /* limit to APIs supported by core */
123310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu      disp->ClientAPIsMask &= _EGL_API_ALL_BITS;
1245a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu
1252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = drv;
1262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } else {
1275a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      major_int = disp->APImajor;
1285a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      minor_int = disp->APIminor;
129adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
1302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   /* Update applications version of major and minor if not NULL */
1322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((major != NULL) && (minor != NULL)) {
1332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *major = major_int;
1342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *minor = minor_int;
1352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
138adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
139adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
140adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1411ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
142adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy)
143adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
1452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
1462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp)
1482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_DISPLAY, __FUNCTION__);
1492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
1512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv) {
152ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu      drv->API.Terminate(drv, disp);
1532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglCloseDriver(drv, disp);
1542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      disp->Driver = NULL;
1552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return EGL_TRUE;
1582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu/**
1622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu * A bunch of check functions and declare macros to simply error checking.
1632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu */
1642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg)
1662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp) {
1682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_DISPLAY, msg);
1692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!disp->Driver) {
1722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_NOT_INITIALIZED, msg);
1732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return disp->Driver;
1762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
1772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
1792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg)
1812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf) {
1862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_SURFACE, msg);
1872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
1892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
190adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
191adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
192adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
1932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
1942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg)
1952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
1962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
1972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
1982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
1992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context) {
2002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, msg);
2012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg)
2092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!conf) {
2142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONFIG, msg);
2152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD(dpy)                                   \
2222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckDisplay(disp, __FUNCTION__);              \
2262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface)              \
2322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface((surface), disp);     \
2342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckSurface(disp, surf, __FUNCTION__);        \
2372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx)                  \
2432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext((ctx), disp);      \
2452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckContext(disp, context, __FUNCTION__);     \
2482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#ifdef EGL_MESA_screen_surface
2542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg)
2582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!scrn) {
2632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_SCREEN_MESA, msg);
2642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wustatic INLINE _EGLDriver *
2712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg)
2722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
2732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv = _eglCheckDisplay(disp, msg);
2742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
2752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m) {
2772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_MODE_MESA, msg);
2782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return NULL;
2792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
2802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv;
2812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu}
2822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen)                \
2852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((screen), disp);        \
2872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
2892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckScreen(disp, scrn, __FUNCTION__);         \
2902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
2932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
2952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_MODE(dpy, mode)                    \
2962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);                 \
2972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode((mode), disp);                 \
2982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;                                            \
2992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   do {                                                        \
3002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      drv = _eglCheckMode(disp, m, __FUNCTION__);              \
3012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (!drv)                                                \
3022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         return EGL_FALSE;                                     \
3032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   } while (0)
3042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#endif /* EGL_MESA_screen_surface */
3072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3091ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY
310adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name)
311adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryString(drv, disp, name);
314adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
315adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
316adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3171ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
3192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu              EGLint config_size, EGLint *num_config)
320adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigs(drv, disp, configs, config_size, num_config);
323adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
324adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
325adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3261ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs,
3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint config_size, EGLint *num_config)
329adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
3312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseConfig(drv, disp, attrib_list, configs,
3322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                config_size, num_config);
333adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
334adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
335adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3361ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
3382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
339adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
3472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetConfigAttrib(drv, disp, conf, attribute, value);
349adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
3532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list,
3542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 const EGLint *attrib_list)
3552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
3562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
3582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *share = _eglLookupContext(share_list, disp);
3592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context;
3612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
3632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
3652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!share && share_list != EGL_NO_CONTEXT) {
3662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
3672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
3682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
3692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   context = drv->API.CreateContext(drv, disp, conf, share, attrib_list);
3712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (context)
3722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkContext(context, disp);
3732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
3742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_CONTEXT;
375adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
376adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3781ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
379adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx)
380adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
3822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkContext(context);
3832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroyContext(drv, disp, context);
384adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
385adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
386adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
3871ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
3882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read,
3892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu               EGLContext ctx)
390adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
3912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
3922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
3932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *draw_surf = _eglLookupSurface(draw, disp);
3942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *read_surf = _eglLookupSurface(read, disp);
3952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckDisplay(disp, __FUNCTION__);
3982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!context && ctx != EGL_NO_CONTEXT)
4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
4022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if ((!draw_surf && draw != EGL_NO_SURFACE) ||
4032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu       (!read_surf && read != EGL_NO_SURFACE))
4042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
4052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context);
407adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
408adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
409adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4101ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx,
4122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
413adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx);
4152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryContext(drv, disp, context, attribute, value);
416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4191ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
4214aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativeWindowType window, const EGLint *attrib_list)
422adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list);
4332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
437adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
438adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
439adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4401ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
4424aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu                       EGLNativePixmapType pixmap, const EGLint *attrib_list)
443adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list);
4542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
458adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
459adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
460adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4611ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
4622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
4632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                        const EGLint *attrib_list)
464adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
4662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
4672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
4682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
4692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
4712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
4722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
4732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
4742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list);
4752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
4762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
4772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
4782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
479adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
480adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
481adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4821ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
483adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface)
484adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _eglUnlinkSurface(surf);
4872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.DestroySurface(drv, disp, surf);
488adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
489adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4901ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface,
4922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint attribute, EGLint *value)
493adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
4942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
4952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QuerySurface(drv, disp, surf, attribute, value);
496adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
497adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4981ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
4992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
5002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                 EGLint attribute, EGLint value)
501adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SurfaceAttrib(drv, disp, surf, attribute, value);
504adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
505adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
506adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5071ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
508adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
509adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.BindTexImage(drv, disp, surf, buffer);
512adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
513adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
514adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5151ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
516adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
517adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ReleaseTexImage(drv, disp, surf, buffer);
520adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
521adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
522adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5231ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
524adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval)
525adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
52657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
52757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   _EGLSurface *surf;
5282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
52957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
530ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || ctx->Resource.Display != disp)
53157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu      return _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
53257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
53357da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   surf = ctx->DrawSurface;
53457da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   if (!_eglIsSurfaceLinked(surf))
53557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
53657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu
53757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu   return drv->API.SwapInterval(drv, disp, surf, interval);
538adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
539adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
540adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5411ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
543adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
544bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
5452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
546bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
547bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   /* surface must be bound to current context in EGL 1.4 */
548bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu   if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface)
549bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
550bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu
5512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.SwapBuffers(drv, disp, surf);
552adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
553adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
554adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5551ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5564aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
557adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SURFACE(dpy, surface);
5592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyBuffers(drv, disp, surf, target);
560adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
561adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
562adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
5646c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void)
565adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
5666c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
5676c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
5682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
5692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5706c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
5712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
5726c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
5736c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
5746c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu      return _eglError(EGL_BAD_CURRENT_SURFACE, __FUNCTION__);
5752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5766c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* a valid current context implies an initialized current display */
577ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
5782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
5796c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   assert(drv);
5806c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
5816c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return drv->API.WaitClient(drv, disp, ctx);
5826c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu}
5836c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
5842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
5856c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY
5866c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void)
5876c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{
5886c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2
5896c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLThreadInfo *t = _eglGetCurrentThread();
5906c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint api_index = t->CurrentAPIIndex;
5916c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API);
5926c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   EGLBoolean ret;
5936c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
5946c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (api_index != es_index && _eglIsCurrentThreadDummy())
5956c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglWaitGL");
5966c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu
5976c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = es_index;
5986c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   ret = eglWaitClient();
5996c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   t->CurrentAPIIndex = api_index;
6006c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return ret;
6016c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else
6026c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   return eglWaitClient();
6036c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif
604adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
605adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
606adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6071ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine)
609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6106c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
6116c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   _EGLDisplay *disp;
6122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
6132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6146c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!ctx)
6152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_TRUE;
6166c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* let bad current context imply bad current surface */
6176c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface))
6186c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu      return _eglError(EGL_BAD_CURRENT_SURFACE, __FUNCTION__);
6192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6206c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   /* a valid current context implies an initialized current display */
621ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu   disp = ctx->Resource.Display;
6222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = disp->Driver;
6236c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   assert(drv);
6242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
6252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.WaitNative(drv, disp, engine);
626adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
627adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
628adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6291ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY
630adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void)
631adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
632adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLDisplay *dpy = _eglGetCurrentDisplay();
633721ba15bf4596b2e9589e7656005b387724875c3Brian Paul   return _eglGetDisplayHandle(dpy);
634adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
635adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
636adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6371ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY
638adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void)
639adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
640adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   _EGLContext *ctx = _eglGetCurrentContext();
6415e7dba541298a29f175f9d077bf6f63030465d94Brian Paul   return _eglGetContextHandle(ctx);
642adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
643adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
644adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6451ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY
646adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw)
647adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
64861906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLContext *ctx = _eglGetCurrentContext();
64961906631202af855d0742586956ff9f34522a525Chia-I Wu   _EGLSurface *surf;
65061906631202af855d0742586956ff9f34522a525Chia-I Wu
65161906631202af855d0742586956ff9f34522a525Chia-I Wu   if (!ctx)
65261906631202af855d0742586956ff9f34522a525Chia-I Wu      return EGL_NO_SURFACE;
65361906631202af855d0742586956ff9f34522a525Chia-I Wu
65461906631202af855d0742586956ff9f34522a525Chia-I Wu   switch (readdraw) {
65561906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_DRAW:
65661906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->DrawSurface;
65761906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
65861906631202af855d0742586956ff9f34522a525Chia-I Wu   case EGL_READ:
65961906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = ctx->ReadSurface;
66061906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
66161906631202af855d0742586956ff9f34522a525Chia-I Wu   default:
66261906631202af855d0742586956ff9f34522a525Chia-I Wu      _eglError(EGL_BAD_PARAMETER, __FUNCTION__);
66361906631202af855d0742586956ff9f34522a525Chia-I Wu      surf = NULL;
66461906631202af855d0742586956ff9f34522a525Chia-I Wu      break;
66561906631202af855d0742586956ff9f34522a525Chia-I Wu   }
66661906631202af855d0742586956ff9f34522a525Chia-I Wu
66761906631202af855d0742586956ff9f34522a525Chia-I Wu   return _eglGetSurfaceHandle(surf);
668adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
669adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
670adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
6711ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY
672adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void)
673adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
67448822796339cb4a55714dc3f1abbe379562ec538Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
67548822796339cb4a55714dc3f1abbe379562ec538Brian Paul   EGLint e = t->LastError;
67675da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (!_eglIsCurrentThreadDummy())
67775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      t->LastError = EGL_SUCCESS;
678adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return e;
679adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
680adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
681adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
68295f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY
68395f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname)
684adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
6859061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   static const struct {
686adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      const char *name;
687adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      _EGLProc function;
6889061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   } egl_functions[] = {
6899061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      /* extensions only */
690b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface
6917012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA },
6927012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModesMESA", (_EGLProc) eglGetModesMESA },
6937012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA },
6941c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA },
6957012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA },
6967012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA },
69748822796339cb4a55714dc3f1abbe379562ec538Brian Paul      { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA },
6987012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA },
6997012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA },
7007012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA },
7017012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA },
7027012d01d888d482f2c6ad1180231a482026d213aJon Smirl      { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA },
703b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */
704a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
705a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR },
706a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR },
707a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
708adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      { NULL, NULL }
709adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   };
710adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   EGLint i;
7119061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
7129061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (!procname)
7139061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      return NULL;
7149061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu   if (strncmp(procname, "egl", 3) == 0) {
7159061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu      for (i = 0; egl_functions[i].name; i++) {
7169061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu         if (strcmp(egl_functions[i].name, procname) == 0)
7179061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu            return egl_functions[i].function;
718adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul      }
719adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   }
720e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
72157929eda3e876dc60be7060237a669f042be2376Chia-I Wu   _eglPreloadDrivers();
722e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu
723e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   /* now loop over drivers to query their procs */
724e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   for (i = 0; i < _eglGlobal.NumDrivers; i++) {
7253e6139d158a054a0dfe8def28bf60201cdb9f385Chia-I Wu      _EGLDriver *drv = _eglGlobal.Drivers[i];
7263e6139d158a054a0dfe8def28bf60201cdb9f385Chia-I Wu      _EGLProc p = drv->API.GetProcAddress(drv, procname);
727e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul      if (p)
728e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul         return p;
729e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul   }
730e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul
731adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul   return NULL;
732adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
733adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
734adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7359061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface
7369061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
7379061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
738adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/*
739adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension
740adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */
741adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7421ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
743c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen,
744adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  const EGLint *attrib_list, EGLModeMESA *modes,
745adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul                  EGLint modes_size, EGLint *num_modes)
746adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list,
7492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  modes, modes_size, num_modes);
750adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
751adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
752adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7531ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes,
7552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                EGLint mode_size, EGLint *num_mode)
756adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
7582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode);
759adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7621ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode,
7642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                     EGLint attribute, EGLint *value)
765adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
7672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetModeAttribMESA(drv, disp, m, attribute, value);
768adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
769adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
770adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
7711ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY
7722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest,
7732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint mask)
7742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{
7752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
7762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *source_context = _eglLookupContext(source, disp);
7772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLContext *dest_context = _eglLookupContext(dest, disp);
7782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
7792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckContext(disp, source_context, __FUNCTION__);
7812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv || !dest_context) {
7822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      if (drv)
7832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu         _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
7841c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl      return EGL_FALSE;
7852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   }
7862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
7872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.CopyContextMESA(drv, disp, source_context, dest_context,
7882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                   mask);
7891c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl}
7901c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
7911c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl
792adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
7932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens,
7942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                  EGLint max_screens, EGLint *num_screens)
795adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
7962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD(dpy);
7972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.GetScreensMESA(drv, disp, screens,
7982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                  max_screens, num_screens);
799adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
800adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
801adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
802c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PaulEGLSurface
8032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config,
8042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                           const EGLint *attrib_list)
805adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
8082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
8102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
8122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
8142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list);
8162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
8172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
8182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
8192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
820adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
821adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
822adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
823adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen,
8252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                         EGLSurface surface, EGLModeMESA mode)
826adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
8292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf = _eglLookupSurface(surface, disp);
8302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m = _eglLookupMode(mode, disp);
8312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
8342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
8362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!surf && surface != EGL_NO_SURFACE)
8372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_SURFACE, __FUNCTION__);
8382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!m && mode != EGL_NO_MODE_MESA)
8392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglError(EGL_BAD_MODE_MESA, __FUNCTION__);
8402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m);
842adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
843adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
844adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
845adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8467012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y)
847adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
8492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.ScreenPositionMESA(drv, disp, scrn, x, y);
8507012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
8517012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8527012d01d888d482f2c6ad1180231a482026d213aJon Smirl
8537012d01d888d482f2c6ad1180231a482026d213aJon SmirlEGLBoolean
8542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen,
8552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                   EGLint attribute, EGLint *value)
8567012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
8572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_SCREEN(dpy, screen);
8582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value);
859adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
860adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
861adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
862adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen,
8642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                          EGLSurface *surface)
865adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
8682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
8702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
8722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
8742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf) != EGL_TRUE)
8762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      surf = NULL;
8772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surface)
8782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *surface = _eglGetSurfaceHandle(surf);
8792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (surf != NULL);
880adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
881adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
882adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
883adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean
8847012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode)
885adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
8862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
8872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp);
8882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
8892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLMode *m;
8902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckScreen(disp, scrn, __FUNCTION__);
8922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
8932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_FALSE;
8942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
8952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (drv->API.QueryScreenModeMESA(drv, disp, scrn, &m) != EGL_TRUE)
8962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      m = NULL;
8972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (mode)
8982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      *mode = m->Handle;
8992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return (m != NULL);
901adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul}
902adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
903adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9047012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char *
9057012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode)
9067012d01d888d482f2c6ad1180231a482026d213aJon Smirl{
9072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGL_DECLARE_DD_AND_MODE(dpy, mode);
9082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   return drv->API.QueryModeStringMESA(drv, disp, m);
9097012d01d888d482f2c6ad1180231a482026d213aJon Smirl}
9107012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9117012d01d888d482f2c6ad1180231a482026d213aJon Smirl
9129061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */
9139061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
9149061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu
915b2006a40eb22899d38cd31691640555228e36975Brian Paul/**
916b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2
917b2006a40eb22899d38cd31691640555228e36975Brian Paul **/
918b2006a40eb22899d38cd31691640555228e36975Brian Paul
919b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2
920b2006a40eb22899d38cd31691640555228e36975Brian Paul
921d5078b94323241a6482f54797756116b1c864327Brian Paul
922d5078b94323241a6482f54797756116b1c864327Brian Paul/**
923d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including:
924d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglCreateContext()
925d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentContext()
926d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentDisplay()
927d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglGetCurrentSurface()
928d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
929d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitClient()
930d5078b94323241a6482f54797756116b1c864327Brian Paul *  eglWaitNative()
931d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details.
932d5078b94323241a6482f54797756116b1c864327Brian Paul */
933b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
934b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api)
935b2006a40eb22899d38cd31691640555228e36975Brian Paul{
936b2006a40eb22899d38cd31691640555228e36975Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
937b2006a40eb22899d38cd31691640555228e36975Brian Paul
93875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   if (_eglIsCurrentThreadDummy())
93975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu      return _eglError(EGL_BAD_ALLOC, "eglBindAPI");
94075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu
94121b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   if (!_eglIsApiValid(api))
94221b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu      return _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
94321b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu
944310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
945b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
946b2006a40eb22899d38cd31691640555228e36975Brian Paul}
947b2006a40eb22899d38cd31691640555228e36975Brian Paul
948b2006a40eb22899d38cd31691640555228e36975Brian Paul
949d5078b94323241a6482f54797756116b1c864327Brian Paul/**
950d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI().
951d5078b94323241a6482f54797756116b1c864327Brian Paul */
952d5078b94323241a6482f54797756116b1c864327Brian PaulEGLenum
953d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void)
954d5078b94323241a6482f54797756116b1c864327Brian Paul{
955d5078b94323241a6482f54797756116b1c864327Brian Paul   /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
956d5078b94323241a6482f54797756116b1c864327Brian Paul   _EGLThreadInfo *t = _eglGetCurrentThread();
95721b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu   return _eglConvertApiFromIndex(t->CurrentAPIIndex);
958d5078b94323241a6482f54797756116b1c864327Brian Paul}
959d5078b94323241a6482f54797756116b1c864327Brian Paul
960d5078b94323241a6482f54797756116b1c864327Brian Paul
961b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLSurface
962b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype,
963b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 EGLClientBuffer buffer, EGLConfig config,
964b2006a40eb22899d38cd31691640555228e36975Brian Paul                                 const EGLint *attrib_list)
965b2006a40eb22899d38cd31691640555228e36975Brian Paul{
9662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
9672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLConfig *conf = _eglLookupConfig(config, disp);
9682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLDriver *drv;
9692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   _EGLSurface *surf;
9702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   drv = _eglCheckConfig(disp, conf, __FUNCTION__);
9722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!drv)
9732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
9742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
9752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer,
9762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu                                                 conf, attrib_list);
9772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (surf)
9782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return _eglLinkSurface(surf, disp);
9792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   else
9802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      return EGL_NO_SURFACE;
981b2006a40eb22899d38cd31691640555228e36975Brian Paul}
982b2006a40eb22899d38cd31691640555228e36975Brian Paul
983b2006a40eb22899d38cd31691640555228e36975Brian Paul
984b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean
985b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void)
986b2006a40eb22899d38cd31691640555228e36975Brian Paul{
98711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu   /* unbind current contexts */
9882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu   if (!_eglIsCurrentThreadDummy()) {
98911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      _EGLThreadInfo *t = _eglGetCurrentThread();
99011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      EGLint i;
99111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu
99211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu      for (i = 0; i < _EGL_API_NUM_APIS; i++) {
99311cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         _EGLContext *ctx = t->CurrentContexts[i];
99411cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         if (ctx) {
99511cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDisplay *disp = ctx->Resource.Display;
99611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            _EGLDriver *drv = disp->Driver;
99711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            /* what if drv is not avaialbe? */
99811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu            if (drv)
99911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu               (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL);
100011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu         }
10012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu      }
1002b2006a40eb22899d38cd31691640555228e36975Brian Paul   }
10032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu
100475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu   _eglDestroyCurrentThread();
1005b2006a40eb22899d38cd31691640555228e36975Brian Paul   return EGL_TRUE;
1006b2006a40eb22899d38cd31691640555228e36975Brian Paul}
10077012d01d888d482f2c6ad1180231a482026d213aJon Smirl
10087012d01d888d482f2c6ad1180231a482026d213aJon Smirl
1009b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */
1010a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1011a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1012a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base
1013a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1014a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1015a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WuEGLImageKHR
1016a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target,
1017a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu                  EGLClientBuffer buffer, const EGLint *attr_list)
1018a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1019a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
1020a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLContext *context = _eglLookupContext(ctx, disp);
1021a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1022a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img;
1023a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1024a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   drv = _eglCheckDisplay(disp, __FUNCTION__);
1025a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!drv)
1026a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return EGL_NO_IMAGE_KHR;
1027a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!context && ctx != EGL_NO_CONTEXT) {
1028a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      _eglError(EGL_BAD_CONTEXT, __FUNCTION__);
1029a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return EGL_NO_IMAGE_KHR;
1030a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   }
1031a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1032a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   img = drv->API.CreateImageKHR(drv,
1033a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu         disp, context, target, buffer, attr_list);
1034a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (img)
1035a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return _eglLinkImage(img, disp);
1036a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   else
1037a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return EGL_NO_IMAGE_KHR;
1038a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1039a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1040a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1041a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WuEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
1042a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{
1043a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDisplay *disp = _eglLookupDisplay(dpy);
1044a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLImage *img = _eglLookupImage(image, disp);
1045a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _EGLDriver *drv;
1046a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1047a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   drv = _eglCheckDisplay(disp, __FUNCTION__);
1048a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!drv)
1049a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return EGL_FALSE;
1050a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (!img)
1051a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu      return _eglError(EGL_BAD_PARAMETER, __FUNCTION__);
1052a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1053a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   _eglUnlinkImage(img);
1054a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   return drv->API.DestroyImageKHR(drv, disp, img);
1055a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu}
1056a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1057a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1058a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */
1059