eglapi.c revision f3e03e1277839cddc35e0cc3427a7972bc17a10a
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" 6394cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h" 64adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h" 65adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h" 662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h" 672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h" 682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h" 69a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h" 70adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 71adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 72adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/** 73f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint. 74f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */ 75f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_ERROR(disp, err, ret) \ 76f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu ({ \ 77f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu /* EGL error codes are non-zero */ \ 78f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (err) \ 79f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(err, __FUNCTION__); \ 80f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu ret; \ 81f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu }) 82f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 83f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 84f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/** 85f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking. 86f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */ 87f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret) \ 88f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu ({ \ 89f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *__drv = _eglCheckDisplay(disp, __FUNCTION__); \ 90f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!__drv) \ 91f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return _EGL_ERROR(disp, 0, ret); \ 92f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu __drv; \ 93f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu }) 94f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 95f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 96f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret) \ 97f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu ({ \ 98f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *__drv = _eglCheck ## type(disp, obj, __FUNCTION__); \ 99f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!__drv) \ 100f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return _EGL_ERROR(disp, 0, ret); \ 101f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu __drv; \ 102f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu }) 103f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_SURFACE(disp, surf, ret) \ 104f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGL_CHECK_OBJECT(disp, Surface, surf, ret) 105f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_CONTEXT(disp, context, ret) \ 106f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGL_CHECK_OBJECT(disp, Context, context, ret) 107f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_CONFIG(disp, conf, ret) \ 108f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGL_CHECK_OBJECT(disp, Config, conf, ret) 109f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_SCREEN(disp, scrn, ret) \ 110f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGL_CHECK_OBJECT(disp, Screen, scrn, ret) 111f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#define _EGL_CHECK_MODE(disp, m, ret) \ 112f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGL_CHECK_OBJECT(disp, Mode, m, ret) 113f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 114f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 115f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 116f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg) 117f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 118f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!disp) { 119f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_DISPLAY, msg); 120f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 121f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 122f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!disp->Initialized) { 123f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_NOT_INITIALIZED, msg); 124f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 125f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 126f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return disp->Driver; 127f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 128f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 129f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 130f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 131f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg) 132f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 133f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 134f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 135f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 136f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!surf) { 137f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_SURFACE, msg); 138f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 139f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 140f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 141f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 142f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 143f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 144f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 145f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg) 146f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 147f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 148f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 149f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 150f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!context) { 151f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_CONTEXT, msg); 152f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 153f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 154f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 155f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 156f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 157f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg) 160f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!conf) { 165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_CONFIG, msg); 166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#ifdef EGL_MESA_screen_surface 173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 175f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg) 177f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 178f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 179f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 180f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 181f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!scrn) { 182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_SCREEN_MESA, msg); 183f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 184f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 185f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 186f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 187f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 188f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 189f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg) 191f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 192f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 193f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 194f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 195f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!m) { 196f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_MODE_MESA, msg); 197f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 198f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 199f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 200f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 201f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 202f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 203f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */ 204f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 205f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 206f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/** 2076052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls. 2086052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * We initialize our global vars and create a private _EGLDisplay object. 209adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */ 2101ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY 2114aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay) 212adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 213adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul _EGLDisplay *dpy; 214be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu dpy = _eglFindDisplay(nativeDisplay); 215be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu if (!dpy) { 216be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu dpy = _eglNewDisplay(nativeDisplay); 217be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu if (dpy) 218be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu _eglLinkDisplay(dpy); 219be9d1ab171b1b29108c781af84dd500707a12925Chia-I Wu } 220721ba15bf4596b2e9589e7656005b387724875c3Brian Paul return _eglGetDisplayHandle(dpy); 221adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 222adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 223adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 2246052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/** 2256052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls. 2266052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver. 2276052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */ 2281ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 229adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 230adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 2312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 2327e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White EGLint major_int, minor_int; 2337e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White 2342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!disp) 2352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglError(EGL_BAD_DISPLAY, __FUNCTION__); 2362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 237a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (!disp->Initialized) { 238a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu _EGLDriver *drv = disp->Driver; 23957929eda3e876dc60be7060237a669f042be2376Chia-I Wu 240a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (!drv) { 241a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu _eglPreloadDrivers(); 242a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu drv = _eglMatchDriver(disp); 243a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (!drv) 244a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__); 245a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu } 2462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 2472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu /* Initialize the particular display now */ 248092b1ca989ba3bdc3f4d421b83b3943af260b7dbChia-I Wu if (!drv->API.Initialize(drv, disp, &major_int, &minor_int)) 2492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglError(EGL_NOT_INITIALIZED, __FUNCTION__); 250c56e15b093c367e7e17ebd2e153baab8cafd213aBrian Paul 2515a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu disp->APImajor = major_int; 2525a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu disp->APIminor = minor_int; 2535a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu snprintf(disp->Version, sizeof(disp->Version), 2542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu "%d.%d (%s)", major_int, minor_int, drv->Name); 2552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 256310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu /* limit to APIs supported by core */ 257310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu disp->ClientAPIsMask &= _EGL_API_ALL_BITS; 2585a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu 2592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu disp->Driver = drv; 260a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu disp->Initialized = EGL_TRUE; 2612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } else { 2625a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu major_int = disp->APImajor; 2635a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu minor_int = disp->APIminor; 264adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul } 2652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 2662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu /* Update applications version of major and minor if not NULL */ 2672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if ((major != NULL) && (minor != NULL)) { 2682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu *major = major_int; 2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu *minor = minor_int; 2702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 2712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 2722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_TRUE; 273adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 274adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 275adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 2761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 277adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy) 278adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 2792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 2802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 2812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!disp) 2822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglError(EGL_BAD_DISPLAY, __FUNCTION__); 2832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 284a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (disp->Initialized) { 285a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu _EGLDriver *drv = disp->Driver; 286a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu 287ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu drv->API.Terminate(drv, disp); 288a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu /* do not reset disp->Driver */ 289a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu disp->Initialized = EGL_FALSE; 2902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_TRUE; 2932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu} 2942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 2952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 2962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD(dpy) \ 2972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); \ 2982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; \ 2992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu do { \ 3002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckDisplay(disp, __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#define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface) \ 3072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); \ 3082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf = _eglLookupSurface((surface), disp); \ 3092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; \ 3102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu do { \ 3112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckSurface(disp, surf, __FUNCTION__); \ 3122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) \ 3132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_FALSE; \ 3142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } while (0) 3152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx) \ 3182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); \ 3192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context = _eglLookupContext((ctx), disp); \ 3202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; \ 3212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu do { \ 3222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckContext(disp, context, __FUNCTION__); \ 3232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) \ 3242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_FALSE; \ 3252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } while (0) 3262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen) \ 3292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); \ 3302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLScreen *scrn = _eglLookupScreen((screen), disp); \ 3312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; \ 3322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu do { \ 3332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckScreen(disp, scrn, __FUNCTION__); \ 3342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) \ 3352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_FALSE; \ 3362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } while (0) 3372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#define _EGL_DECLARE_DD_AND_MODE(dpy, mode) \ 3402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); \ 3412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLMode *m = _eglLookupMode((mode), disp); \ 3422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; \ 3432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu do { \ 3442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckMode(disp, m, __FUNCTION__); \ 3452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) \ 3462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_FALSE; \ 3472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } while (0) 3482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3501ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY 351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name) 352adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 3532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD(dpy); 3542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.QueryString(drv, disp, name); 355adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 356adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3581ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 3592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs, 3602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint config_size, EGLint *num_config) 361adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 3622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD(dpy); 3632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.GetConfigs(drv, disp, configs, config_size, num_config); 364adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 365adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 366adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3671ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 3682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, 3692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint config_size, EGLint *num_config) 370adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 3712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD(dpy); 3722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.ChooseConfig(drv, disp, attrib_list, configs, 3732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu config_size, num_config); 374adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 375adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 376adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3771ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 3782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 3792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 380adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 3812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 3822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 3832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 3842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckConfig(disp, conf, __FUNCTION__); 3862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 3872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_FALSE; 3882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.GetConfigAttrib(drv, disp, conf, attribute, value); 390adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 391adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 392adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY 3942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list, 3952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{ 3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 3982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *share = _eglLookupContext(share_list, disp); 4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context; 4022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 4032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckConfig(disp, conf, __FUNCTION__); 4042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 4052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_CONTEXT; 4062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!share && share_list != EGL_NO_CONTEXT) { 4072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglError(EGL_BAD_CONTEXT, __FUNCTION__); 4082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_CONTEXT; 4092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 4102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 4112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu context = drv->API.CreateContext(drv, disp, conf, share, attrib_list); 4122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (context) 4132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglLinkContext(context, disp); 4142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu else 4152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_CONTEXT; 416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4191ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 420adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx) 421adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 4222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx); 4232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglUnlinkContext(context); 4242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.DestroyContext(drv, disp, context); 425adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 426adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 427adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4281ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 4292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, 4302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLContext ctx) 431adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 4322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 4332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 4342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *draw_surf = _eglLookupSurface(draw, disp); 4352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *read_surf = _eglLookupSurface(read, disp); 4362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 4372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 43817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (!disp) 43917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu return _eglError(EGL_BAD_DISPLAY, __FUNCTION__); 44017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu drv = disp->Driver; 44117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu 44217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu /* display is allowed to be uninitialized under certain condition */ 44317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (!disp->Initialized) { 44417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE || 44517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu ctx != EGL_NO_CONTEXT) 44617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu return _eglError(EGL_BAD_DISPLAY, __FUNCTION__); 44717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu } 4482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 44917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu return EGL_TRUE; 45017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu 4512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!context && ctx != EGL_NO_CONTEXT) 4522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglError(EGL_BAD_CONTEXT, __FUNCTION__); 4532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if ((!draw_surf && draw != EGL_NO_SURFACE) || 4542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu (!read_surf && read != EGL_NO_SURFACE)) 4552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglError(EGL_BAD_SURFACE, __FUNCTION__); 4562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 4572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context); 458adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 459adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 460adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4611ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 4622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx, 4632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 464adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 4652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx); 4662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.QueryContext(drv, disp, context, attribute, value); 467adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 468adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 469adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4701ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 4712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, 4724aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu EGLNativeWindowType window, const EGLint *attrib_list) 473adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 4742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 4752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 4762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 4772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 4782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 4792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckConfig(disp, conf, __FUNCTION__); 4802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 4812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 4822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 4832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list); 4842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (surf) 4852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglLinkSurface(surf, disp); 4862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu else 4872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 488adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 489adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 490adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 4922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, 4934aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu EGLNativePixmapType pixmap, const EGLint *attrib_list) 494adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 4952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 4962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 4972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 4982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 4992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 5002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckConfig(disp, conf, __FUNCTION__); 5012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 5022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 5032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 5042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list); 5052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (surf) 5062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglLinkSurface(surf, disp); 5072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu else 5082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 509adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 510adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 511adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 5132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, 5142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 515adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 5162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 5172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 5182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 5192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 5202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 5212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckConfig(disp, conf, __FUNCTION__); 5222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 5232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 5242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 5252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list); 5262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (surf) 5272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglLinkSurface(surf, disp); 5282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu else 5292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 530adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 531adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 532adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5331ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 534adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface) 535adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 5362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SURFACE(dpy, surface); 5372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglUnlinkSurface(surf); 5382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.DestroySurface(drv, disp, surf); 539adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 540adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5411ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 5422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface, 5432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 544adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 5452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SURFACE(dpy, surface); 5462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.QuerySurface(drv, disp, surf, attribute, value); 547adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 548adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 5502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, 5512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint value) 552adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 5532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SURFACE(dpy, surface); 5542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.SurfaceAttrib(drv, disp, surf, attribute, value); 555adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 556adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 557adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5581ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 560adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 5612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SURFACE(dpy, surface); 5622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.BindTexImage(drv, disp, surf, buffer); 563adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 564adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 565adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5661ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 567adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 568adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 5692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SURFACE(dpy, surface); 5702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.ReleaseTexImage(drv, disp, surf, buffer); 571adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 572adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 573adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5741ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 575adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval) 576adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 57757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 57857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu _EGLSurface *surf; 5792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD(dpy); 58057da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 581ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu if (!ctx || !_eglIsContextLinked(ctx) || ctx->Resource.Display != disp) 58257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu return _eglError(EGL_BAD_CONTEXT, __FUNCTION__); 58357da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 58457da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu surf = ctx->DrawSurface; 58557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu if (!_eglIsSurfaceLinked(surf)) 58657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu return _eglError(EGL_BAD_SURFACE, __FUNCTION__); 58757da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 58857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu return drv->API.SwapInterval(drv, disp, surf, interval); 589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 591adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5921ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 5932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface) 594adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 595bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 5962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SURFACE(dpy, surface); 597bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu 598bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu /* surface must be bound to current context in EGL 1.4 */ 599bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface) 600bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu return _eglError(EGL_BAD_SURFACE, __FUNCTION__); 601bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu 6022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.SwapBuffers(drv, disp, surf); 603adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 604adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 605adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6061ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6074aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) 608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 6092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SURFACE(dpy, surface); 6102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.CopyBuffers(drv, disp, surf, target); 611adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 612adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 613adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6141ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6156c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void) 616adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 6176c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 6186c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLDisplay *disp; 6192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 6202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6216c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!ctx) 6222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_TRUE; 6236c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu /* let bad current context imply bad current surface */ 6246c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface)) 6256c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu return _eglError(EGL_BAD_CURRENT_SURFACE, __FUNCTION__); 6262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6276c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu /* a valid current context implies an initialized current display */ 628ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu disp = ctx->Resource.Display; 629a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu assert(disp->Initialized); 6302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = disp->Driver; 6316c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 6326c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu return drv->API.WaitClient(drv, disp, ctx); 6336c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu} 6346c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 6352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6366c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY 6376c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void) 6386c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{ 6396c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2 6406c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLThreadInfo *t = _eglGetCurrentThread(); 6416c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu EGLint api_index = t->CurrentAPIIndex; 6426c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API); 6436c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu EGLBoolean ret; 6446c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 6456c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (api_index != es_index && _eglIsCurrentThreadDummy()) 6466c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu return _eglError(EGL_BAD_ALLOC, "eglWaitGL"); 6476c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 6486c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu t->CurrentAPIIndex = es_index; 6496c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu ret = eglWaitClient(); 6506c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu t->CurrentAPIIndex = api_index; 6516c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu return ret; 6526c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else 6536c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu return eglWaitClient(); 6546c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif 655adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 656adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 657adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6581ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 659adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine) 660adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 6616c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 6626c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLDisplay *disp; 6632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 6642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6656c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!ctx) 6662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_TRUE; 6676c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu /* let bad current context imply bad current surface */ 6686c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface)) 6696c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu return _eglError(EGL_BAD_CURRENT_SURFACE, __FUNCTION__); 6702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6716c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu /* a valid current context implies an initialized current display */ 672ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu disp = ctx->Resource.Display; 673a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu assert(disp->Initialized); 6742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = disp->Driver; 6752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.WaitNative(drv, disp, engine); 677adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 678adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 679adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6801ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY 681adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void) 682adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 683a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 684a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu return (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY; 685adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 686adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 687adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6881ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY 689adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void) 690adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 691adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul _EGLContext *ctx = _eglGetCurrentContext(); 6925e7dba541298a29f175f9d077bf6f63030465d94Brian Paul return _eglGetContextHandle(ctx); 693adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 694adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 695adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6961ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 697adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw) 698adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 69961906631202af855d0742586956ff9f34522a525Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 70061906631202af855d0742586956ff9f34522a525Chia-I Wu _EGLSurface *surf; 70161906631202af855d0742586956ff9f34522a525Chia-I Wu 70261906631202af855d0742586956ff9f34522a525Chia-I Wu if (!ctx) 70361906631202af855d0742586956ff9f34522a525Chia-I Wu return EGL_NO_SURFACE; 70461906631202af855d0742586956ff9f34522a525Chia-I Wu 70561906631202af855d0742586956ff9f34522a525Chia-I Wu switch (readdraw) { 70661906631202af855d0742586956ff9f34522a525Chia-I Wu case EGL_DRAW: 70761906631202af855d0742586956ff9f34522a525Chia-I Wu surf = ctx->DrawSurface; 70861906631202af855d0742586956ff9f34522a525Chia-I Wu break; 70961906631202af855d0742586956ff9f34522a525Chia-I Wu case EGL_READ: 71061906631202af855d0742586956ff9f34522a525Chia-I Wu surf = ctx->ReadSurface; 71161906631202af855d0742586956ff9f34522a525Chia-I Wu break; 71261906631202af855d0742586956ff9f34522a525Chia-I Wu default: 71361906631202af855d0742586956ff9f34522a525Chia-I Wu _eglError(EGL_BAD_PARAMETER, __FUNCTION__); 71461906631202af855d0742586956ff9f34522a525Chia-I Wu surf = NULL; 71561906631202af855d0742586956ff9f34522a525Chia-I Wu break; 71661906631202af855d0742586956ff9f34522a525Chia-I Wu } 71761906631202af855d0742586956ff9f34522a525Chia-I Wu 71861906631202af855d0742586956ff9f34522a525Chia-I Wu return _eglGetSurfaceHandle(surf); 719adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 720adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 721adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY 723adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void) 724adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 72548822796339cb4a55714dc3f1abbe379562ec538Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 72648822796339cb4a55714dc3f1abbe379562ec538Brian Paul EGLint e = t->LastError; 72775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu if (!_eglIsCurrentThreadDummy()) 72875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu t->LastError = EGL_SUCCESS; 729adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul return e; 730adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 731adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 732adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 73395f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY 73495f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname) 735adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 7369061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu static const struct { 737adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul const char *name; 738adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul _EGLProc function; 7399061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu } egl_functions[] = { 7409061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu /* extensions only */ 741b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface 7427012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA }, 7437012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglGetModesMESA", (_EGLProc) eglGetModesMESA }, 7447012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA }, 7451c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA }, 7467012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA }, 7477012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA }, 74848822796339cb4a55714dc3f1abbe379562ec538Brian Paul { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA }, 7497012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA }, 7507012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA }, 7517012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA }, 7527012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA }, 7537012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA }, 754b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */ 755a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base 756a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR }, 757a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR }, 758a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */ 759adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul { NULL, NULL } 760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul }; 761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul EGLint i; 7629061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 7639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu if (!procname) 7649061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu return NULL; 7659061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu if (strncmp(procname, "egl", 3) == 0) { 7669061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu for (i = 0; egl_functions[i].name; i++) { 7679061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu if (strcmp(egl_functions[i].name, procname) == 0) 7689061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu return egl_functions[i].function; 769adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul } 770adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul } 771e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul 77257929eda3e876dc60be7060237a669f042be2376Chia-I Wu _eglPreloadDrivers(); 773e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu 774e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul /* now loop over drivers to query their procs */ 775e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul for (i = 0; i < _eglGlobal.NumDrivers; i++) { 7763e6139d158a054a0dfe8def28bf60201cdb9f385Chia-I Wu _EGLDriver *drv = _eglGlobal.Drivers[i]; 7773e6139d158a054a0dfe8def28bf60201cdb9f385Chia-I Wu _EGLProc p = drv->API.GetProcAddress(drv, procname); 778e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul if (p) 779e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul return p; 780e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul } 781e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul 782adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul return NULL; 783adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 784adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 785adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7869061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface 7879061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 7889061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 789adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/* 790adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension 791adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */ 792adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 794c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen, 795adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul const EGLint *attrib_list, EGLModeMESA *modes, 796adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul EGLint modes_size, EGLint *num_modes) 797adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 7982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SCREEN(dpy, screen); 7992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list, 8002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu modes, modes_size, num_modes); 801adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 802adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 803adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8041ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 8052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes, 8062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint mode_size, EGLint *num_mode) 807adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SCREEN(dpy, screen); 8092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode); 810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 811adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 812adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 8142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode, 8152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 816adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_MODE(dpy, mode); 8182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.GetModeAttribMESA(drv, disp, m, attribute, value); 819adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 820adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 821adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 8232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest, 8242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint mask) 8252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{ 8262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 8272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *source_context = _eglLookupContext(source, disp); 8282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *dest_context = _eglLookupContext(dest, disp); 8292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 8302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 8312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckContext(disp, source_context, __FUNCTION__); 8322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv || !dest_context) { 8332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (drv) 8342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglError(EGL_BAD_CONTEXT, __FUNCTION__); 8351c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl return EGL_FALSE; 8362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 8372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 8382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.CopyContextMESA(drv, disp, source_context, dest_context, 8392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu mask); 8401c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl} 8411c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl 8421c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl 843adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 8442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens, 8452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint max_screens, EGLint *num_screens) 846adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD(dpy); 8482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.GetScreensMESA(drv, disp, screens, 8492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu max_screens, num_screens); 850adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 851adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 852adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 853c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PaulEGLSurface 8542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config, 8552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 856adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 8582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 8592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 8602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 8612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 8622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckConfig(disp, conf, __FUNCTION__); 8632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 8642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 8652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 8662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list); 8672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (surf) 8682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglLinkSurface(surf, disp); 8692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu else 8702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 871adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 872adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 873adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 874adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 8752f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen, 8762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLSurface surface, EGLModeMESA mode) 877adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 8792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp); 8802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 8812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLMode *m = _eglLookupMode(mode, disp); 8822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 8832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 8842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckScreen(disp, scrn, __FUNCTION__); 8852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 8862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_FALSE; 8872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!surf && surface != EGL_NO_SURFACE) 8882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglError(EGL_BAD_SURFACE, __FUNCTION__); 8892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!m && mode != EGL_NO_MODE_MESA) 8902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglError(EGL_BAD_MODE_MESA, __FUNCTION__); 8912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 8922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m); 893adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 894adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 895adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 896adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 8977012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y) 898adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SCREEN(dpy, screen); 9002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.ScreenPositionMESA(drv, disp, scrn, x, y); 9017012d01d888d482f2c6ad1180231a482026d213aJon Smirl} 9027012d01d888d482f2c6ad1180231a482026d213aJon Smirl 9037012d01d888d482f2c6ad1180231a482026d213aJon Smirl 9047012d01d888d482f2c6ad1180231a482026d213aJon SmirlEGLBoolean 9052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen, 9062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 9077012d01d888d482f2c6ad1180231a482026d213aJon Smirl{ 9082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_SCREEN(dpy, screen); 9092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value); 910adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 911adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 912adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 913adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 9142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, 9152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLSurface *surface) 916adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 9172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 9182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp); 9192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 9202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 9212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 9222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckScreen(disp, scrn, __FUNCTION__); 9232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 9242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_FALSE; 9252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 9262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf) != EGL_TRUE) 9272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = NULL; 9282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (surface) 9292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu *surface = _eglGetSurfaceHandle(surf); 9302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return (surf != NULL); 931adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 932adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 933adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 934adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 9357012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode) 936adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 9372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 9382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp); 9392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 9402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLMode *m; 9412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 9422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckScreen(disp, scrn, __FUNCTION__); 9432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 9442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_FALSE; 9452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 9462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (drv->API.QueryScreenModeMESA(drv, disp, scrn, &m) != EGL_TRUE) 9472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu m = NULL; 9482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (mode) 9492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu *mode = m->Handle; 9502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 9512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return (m != NULL); 952adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 953adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 954adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 9557012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char * 9567012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode) 9577012d01d888d482f2c6ad1180231a482026d213aJon Smirl{ 9582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGL_DECLARE_DD_AND_MODE(dpy, mode); 9592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return drv->API.QueryModeStringMESA(drv, disp, m); 9607012d01d888d482f2c6ad1180231a482026d213aJon Smirl} 9617012d01d888d482f2c6ad1180231a482026d213aJon Smirl 9627012d01d888d482f2c6ad1180231a482026d213aJon Smirl 9639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */ 9649061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 9659061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 966b2006a40eb22899d38cd31691640555228e36975Brian Paul/** 967b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2 968b2006a40eb22899d38cd31691640555228e36975Brian Paul **/ 969b2006a40eb22899d38cd31691640555228e36975Brian Paul 970b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2 971b2006a40eb22899d38cd31691640555228e36975Brian Paul 972d5078b94323241a6482f54797756116b1c864327Brian Paul 973d5078b94323241a6482f54797756116b1c864327Brian Paul/** 974d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including: 975d5078b94323241a6482f54797756116b1c864327Brian Paul * eglCreateContext() 976d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentContext() 977d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentDisplay() 978d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentSurface() 979d5078b94323241a6482f54797756116b1c864327Brian Paul * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT) 980d5078b94323241a6482f54797756116b1c864327Brian Paul * eglWaitClient() 981d5078b94323241a6482f54797756116b1c864327Brian Paul * eglWaitNative() 982d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details. 983d5078b94323241a6482f54797756116b1c864327Brian Paul */ 984b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean 985b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api) 986b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 987b2006a40eb22899d38cd31691640555228e36975Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 988b2006a40eb22899d38cd31691640555228e36975Brian Paul 98975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu if (_eglIsCurrentThreadDummy()) 99075da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu return _eglError(EGL_BAD_ALLOC, "eglBindAPI"); 99175da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu 99221b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu if (!_eglIsApiValid(api)) 99321b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu return _eglError(EGL_BAD_PARAMETER, "eglBindAPI"); 99421b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu 995310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu t->CurrentAPIIndex = _eglConvertApiToIndex(api); 996b2006a40eb22899d38cd31691640555228e36975Brian Paul return EGL_TRUE; 997b2006a40eb22899d38cd31691640555228e36975Brian Paul} 998b2006a40eb22899d38cd31691640555228e36975Brian Paul 999b2006a40eb22899d38cd31691640555228e36975Brian Paul 1000d5078b94323241a6482f54797756116b1c864327Brian Paul/** 1001d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI(). 1002d5078b94323241a6482f54797756116b1c864327Brian Paul */ 1003d5078b94323241a6482f54797756116b1c864327Brian PaulEGLenum 1004d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void) 1005d5078b94323241a6482f54797756116b1c864327Brian Paul{ 1006d5078b94323241a6482f54797756116b1c864327Brian Paul /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */ 1007d5078b94323241a6482f54797756116b1c864327Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 100821b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu return _eglConvertApiFromIndex(t->CurrentAPIIndex); 1009d5078b94323241a6482f54797756116b1c864327Brian Paul} 1010d5078b94323241a6482f54797756116b1c864327Brian Paul 1011d5078b94323241a6482f54797756116b1c864327Brian Paul 1012b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLSurface 1013b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, 1014b2006a40eb22899d38cd31691640555228e36975Brian Paul EGLClientBuffer buffer, EGLConfig config, 1015b2006a40eb22899d38cd31691640555228e36975Brian Paul const EGLint *attrib_list) 1016b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 10172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 10182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 10192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 10202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 10212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 10222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = _eglCheckConfig(disp, conf, __FUNCTION__); 10232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 10242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 10252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 10262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer, 10272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu conf, attrib_list); 10282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (surf) 10292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return _eglLinkSurface(surf, disp); 10302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu else 10312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu return EGL_NO_SURFACE; 1032b2006a40eb22899d38cd31691640555228e36975Brian Paul} 1033b2006a40eb22899d38cd31691640555228e36975Brian Paul 1034b2006a40eb22899d38cd31691640555228e36975Brian Paul 1035b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean 1036b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void) 1037b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 103811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu /* unbind current contexts */ 10392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!_eglIsCurrentThreadDummy()) { 104011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLThreadInfo *t = _eglGetCurrentThread(); 104145ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu EGLint api_index = t->CurrentAPIIndex; 104211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu EGLint i; 104311cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu 104411cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu for (i = 0; i < _EGL_API_NUM_APIS; i++) { 104511cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLContext *ctx = t->CurrentContexts[i]; 104611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu if (ctx) { 104711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLDisplay *disp = ctx->Resource.Display; 104811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLDriver *drv = disp->Driver; 104945ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu t->CurrentAPIIndex = i; 105017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL); 105111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu } 10522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 105345ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu 105445ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu t->CurrentAPIIndex = api_index; 1055b2006a40eb22899d38cd31691640555228e36975Brian Paul } 10562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 105775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu _eglDestroyCurrentThread(); 1058b2006a40eb22899d38cd31691640555228e36975Brian Paul return EGL_TRUE; 1059b2006a40eb22899d38cd31691640555228e36975Brian Paul} 10607012d01d888d482f2c6ad1180231a482026d213aJon Smirl 10617012d01d888d482f2c6ad1180231a482026d213aJon Smirl 1062b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */ 1063a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1064a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1065a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base 1066a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1067a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1068a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WuEGLImageKHR 1069a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 1070a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu EGLClientBuffer buffer, const EGLint *attr_list) 1071a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{ 1072a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 1073a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 1074a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDriver *drv; 1075a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLImage *img; 1076a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1077a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu drv = _eglCheckDisplay(disp, __FUNCTION__); 1078a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (!drv) 1079a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu return EGL_NO_IMAGE_KHR; 1080a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (!context && ctx != EGL_NO_CONTEXT) { 1081a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _eglError(EGL_BAD_CONTEXT, __FUNCTION__); 1082a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu return EGL_NO_IMAGE_KHR; 1083a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu } 1084a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1085a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu img = drv->API.CreateImageKHR(drv, 1086a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu disp, context, target, buffer, attr_list); 1087a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (img) 1088a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu return _eglLinkImage(img, disp); 1089a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu else 1090a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu return EGL_NO_IMAGE_KHR; 1091a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu} 1092a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1093a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1094a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WuEGLBoolean eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) 1095a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{ 1096a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDisplay *disp = _eglLookupDisplay(dpy); 1097a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLImage *img = _eglLookupImage(image, disp); 1098a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDriver *drv; 1099a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1100a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu drv = _eglCheckDisplay(disp, __FUNCTION__); 1101a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (!drv) 1102a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu return EGL_FALSE; 1103a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (!img) 1104a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu return _eglError(EGL_BAD_PARAMETER, __FUNCTION__); 1105a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1106a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _eglUnlinkImage(img); 1107a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu return drv->API.DestroyImageKHR(drv, disp, img); 1108a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu} 1109a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1110a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1111a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */ 1112