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