eglapi.c revision f22665df95406567193dee0089f4830664ff4101
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> 591e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu 601e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu#include "eglstring.h" 61adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h" 62adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h" 63adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h" 64adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglglobals.h" 6594cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h" 66adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h" 67adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h" 682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h" 692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglscreen.h" 702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglmode.h" 71a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h" 72adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 73adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 74adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/** 75f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint. 76655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * 77655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * These macros will unlock the display and record the error code. 78f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */ 79bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_ERROR(disp, err, ret) \ 80bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu do { \ 81655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu if (disp) \ 82655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _eglUnlockDisplay(disp); \ 83f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu /* EGL error codes are non-zero */ \ 84f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (err) \ 85f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(err, __FUNCTION__); \ 86bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu return ret; \ 87bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu } while (0) 88bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 89bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_SUCCESS(disp, ret) \ 90bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_SUCCESS, ret) 91bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 92b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu/* record EGL_SUCCESS only when ret evaluates to true */ 93bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_EVAL(disp, ret) \ 94bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, (ret) ? EGL_SUCCESS : 0, ret) 95f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 96f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 97bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu/* 98f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking. 99f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */ 100bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 101bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret, drv) \ 102bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu do { \ 103bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu drv = _eglCheckDisplay(disp, __FUNCTION__); \ 104bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu if (!drv) \ 105bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, 0, ret); \ 106bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu } while (0) 107bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 108bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret, drv) \ 109bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu do { \ 110bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu drv = _eglCheck ## type(disp, obj, __FUNCTION__); \ 111bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu if (!drv) \ 112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, 0, ret); \ 113bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu } while (0) 114bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 115bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SURFACE(disp, surf, ret, drv) \ 116bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_OBJECT(disp, Surface, surf, ret, drv) 117bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 118bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONTEXT(disp, context, ret, drv) \ 119bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_OBJECT(disp, Context, context, ret, drv) 120bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 121bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONFIG(disp, conf, ret, drv) \ 122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_OBJECT(disp, Config, conf, ret, drv) 123bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 124bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SCREEN(disp, scrn, ret, drv) \ 125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_OBJECT(disp, Screen, scrn, ret, drv) 126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 127bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_MODE(disp, m, ret, drv) \ 128bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_OBJECT(disp, Mode, m, ret, drv) 129bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 130f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 131f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 132f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 133f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg) 134f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 135f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!disp) { 136f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_DISPLAY, msg); 137f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 138f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 139f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!disp->Initialized) { 140f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_NOT_INITIALIZED, msg); 141f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 142f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 143f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return disp->Driver; 144f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 145f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 146f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 147f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 148f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, const char *msg) 149f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 150f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 151f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 152f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 153f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!surf) { 154f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_SURFACE, msg); 155f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 156f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 157f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 160f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg) 163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!context) { 168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_CONTEXT, msg); 169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 175f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, 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 (!conf) { 182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_CONFIG, 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 Wu#ifdef EGL_MESA_screen_surface 190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 191f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 192f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 193f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckScreen(_EGLDisplay *disp, _EGLScreen *scrn, const char *msg) 194f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 195f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 196f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 197f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 198f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!scrn) { 199f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_SCREEN_MESA, msg); 200f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 201f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 202f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 203f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 204f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 205f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 206f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wustatic INLINE _EGLDriver * 207f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckMode(_EGLDisplay *disp, _EGLMode *m, const char *msg) 208f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 209f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 210f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 211f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 212f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!m) { 213f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_MODE_MESA, msg); 214f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 215f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 216f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 217f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 218f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 219f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 220f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu#endif /* EGL_MESA_screen_surface */ 221f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 222f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 223f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/** 224655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display. 225655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */ 226655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE _EGLDisplay * 227655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display) 228655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{ 229655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *dpy = _eglLookupDisplay(display); 230655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu if (dpy) 231655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _eglLockMutex(&dpy->Mutex); 232655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu return dpy; 233655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu} 234655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 235655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 236655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/** 237655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display. 238655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */ 239655f4654675e601a9482e40d8e50156c965b8934Chia-I Wustatic INLINE void 240655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy) 241655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{ 242655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _eglUnlockMutex(&dpy->Mutex); 243655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu} 244655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 245655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 246655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/** 2476052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls. 248db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display. 249adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */ 2501ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY 2514aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay) 252adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 253f22665df95406567193dee0089f4830664ff4101Chia-I Wu _EGLPlatformType plat = _eglGetNativePlatform(); 254f22665df95406567193dee0089f4830664ff4101Chia-I Wu _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay); 255721ba15bf4596b2e9589e7656005b387724875c3Brian Paul return _eglGetDisplayHandle(dpy); 256adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 257adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 258adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 2596052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/** 2606052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls. 2616052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver. 2626052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */ 2631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 264adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 265adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 266655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 26712297f1f98c5daf177938b2598e6fb8ed97a9a66Vinson Lee EGLint major_int = 0, minor_int = 0; 2687e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White 2692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!disp) 270bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE); 2712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 272a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (!disp->Initialized) { 273a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu _EGLDriver *drv = disp->Driver; 27457929eda3e876dc60be7060237a669f042be2376Chia-I Wu 275a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (!drv) { 276a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu _eglPreloadDrivers(); 277a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu drv = _eglMatchDriver(disp); 278681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg /* Initialize the particular display now */ 279681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg if (drv && !drv->API.Initialize(drv, disp, &major_int, &minor_int)) 280681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE); 281a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu } 282681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg if (!drv) 283681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg /* Load and initialize the first default driver that works */ 284681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg drv = _eglLoadDefaultDriver(disp, &major_int, &minor_int); 285681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg if (!drv) 286681fd73f1e95d43425b946a250b241bfdb0ce1c8Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE); 287c56e15b093c367e7e17ebd2e153baab8cafd213aBrian Paul 2885a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu disp->APImajor = major_int; 2895a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu disp->APIminor = minor_int; 2901e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu _eglsnprintf(disp->Version, sizeof(disp->Version), 2912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu "%d.%d (%s)", major_int, minor_int, drv->Name); 2922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 293310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu /* limit to APIs supported by core */ 294310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu disp->ClientAPIsMask &= _EGL_API_ALL_BITS; 2955a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu 2962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu disp->Driver = drv; 297a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu disp->Initialized = EGL_TRUE; 2982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } else { 2995a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu major_int = disp->APImajor; 3005a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu minor_int = disp->APIminor; 301adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul } 3022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu /* Update applications version of major and minor if not NULL */ 3042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if ((major != NULL) && (minor != NULL)) { 3052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu *major = major_int; 3062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu *minor = minor_int; 3072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 3082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 309bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 310adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 311adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 312adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 314adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy) 315adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 316655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 3172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!disp) 319bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE); 3202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 321a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (disp->Initialized) { 322a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu _EGLDriver *drv = disp->Driver; 323a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu 324ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu drv->API.Terminate(drv, disp); 325a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu /* do not reset disp->Driver */ 326a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu disp->Initialized = EGL_FALSE; 3272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 3282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 329bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 3302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu} 3312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 3331ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY 334adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name) 335adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 336655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 337aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 338b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu const char *ret; 339aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 340bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, NULL, drv); 341b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QueryString(drv, disp, name); 342b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 343bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 344adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 345adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 346adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3471ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 3482f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs, 3492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint config_size, EGLint *num_config) 350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 351655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 352aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 353b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 354aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 355bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 356b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config); 357b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 358bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 359adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 360adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 361adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3621ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 3632f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, 3642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint config_size, EGLint *num_config) 365adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 366655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 367aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 368b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 369aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 370bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 371b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs, 3722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu config_size, num_config); 373b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 374bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 375adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 376adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3781ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 3792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 3802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 381adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 382655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 3832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 3842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 385b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 3862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 387bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv); 388b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value); 389b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 390bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 391adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 392adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 393adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 3941ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY 3952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list, 3962f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 3972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{ 398655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 3992f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 4002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *share = _eglLookupContext(share_list, disp); 4012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 4022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context; 403b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLContext ret; 4042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 405bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT, drv); 406b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (!share && share_list != EGL_NO_CONTEXT) 407bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT); 4082f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 4092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu context = drv->API.CreateContext(drv, disp, conf, share, attrib_list); 410b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (context) ? _eglLinkContext(context, disp) : EGL_NO_CONTEXT; 411b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 412bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 413adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 414adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 415adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4161ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx) 418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 419655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 420aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 421aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 422b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 423aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 424bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv); 4252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglUnlinkContext(context); 426b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroyContext(drv, disp, context); 427b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 428bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 429adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 430adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 431adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4321ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 4332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, 4342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLContext ctx) 435adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 436655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 4372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 4382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *draw_surf = _eglLookupSurface(draw, disp); 4392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *read_surf = _eglLookupSurface(read, disp); 4402f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 441b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 4422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 44317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (!disp) 444bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE); 44517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu drv = disp->Driver; 44617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu 44717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu /* display is allowed to be uninitialized under certain condition */ 44817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (!disp->Initialized) { 44917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE || 45017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu ctx != EGL_NO_CONTEXT) 451bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE); 45217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu } 4532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 454bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 45517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu 4562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!context && ctx != EGL_NO_CONTEXT) 457bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE); 4582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if ((!draw_surf && draw != EGL_NO_SURFACE) || 4592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu (!read_surf && read != EGL_NO_SURFACE)) 460bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 4612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 462b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context); 463b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 464bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 465adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 466adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 467adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4681ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 4692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx, 4702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 471adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 472655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 473aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 474aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 475b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 476aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 477bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv); 478b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QueryContext(drv, disp, context, attribute, value); 479b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 480bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 481adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 482adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 483adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 4841ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 4852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, 4864aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu EGLNativeWindowType window, const EGLint *attrib_list) 487adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 488655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 4892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 4902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 4912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 492b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 4932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 494bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 495f22665df95406567193dee0089f4830664ff4101Chia-I Wu if (disp->Platform != _eglGetNativePlatform()) 496f22665df95406567193dee0089f4830664ff4101Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 4972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 4982f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreateWindowSurface(drv, disp, conf, window, attrib_list); 499b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE; 500b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 501bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 502adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 503adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 504adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5051ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 5062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, 5074aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I Wu EGLNativePixmapType pixmap, const EGLint *attrib_list) 508adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 509655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 5102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 5112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 5122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 513b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 5142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 515bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 516f22665df95406567193dee0089f4830664ff4101Chia-I Wu if (disp->Platform != _eglGetNativePlatform()) 517f22665df95406567193dee0089f4830664ff4101Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 5182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 5192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list); 520b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE; 521b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 522bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 523adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 524adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 525adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5261ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 5272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, 5282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 529adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 530655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 5312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 5322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 5332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 534b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 5352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 536bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 5372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 5382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list); 539b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE; 540b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 541bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 542adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 543adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 544adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5451ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 546adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface) 547adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 548655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 549aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 550aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 551b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 552aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 553bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 5542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglUnlinkSurface(surf); 555b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroySurface(drv, disp, surf); 556b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 557bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 558adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 559adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 5612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface, 5622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 563adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 564655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 565aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 566aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 567b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 568aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 569bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 570b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QuerySurface(drv, disp, surf, attribute, value); 571b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 572bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 573adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 574adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5751ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 5762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, 5772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint value) 578adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 579655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 580aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 581aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 582b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 583aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 584bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 585b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value); 586b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 587bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 588adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 589adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 590adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 5911ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 592adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 593adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 594655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 595aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 596aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 597b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 598aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 599bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 600b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.BindTexImage(drv, disp, surf, buffer); 601b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 602bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 603adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 604adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 605adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6061ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 607adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 608adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 609655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 610aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 611aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 612b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 613aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 614bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 615b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer); 616b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 617bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 618adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 619adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 620adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6211ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 622adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval) 623adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 624655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 62557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 62657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu _EGLSurface *surf; 627aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 628b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 629aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 630bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 63157da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 632ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu if (!ctx || !_eglIsContextLinked(ctx) || ctx->Resource.Display != disp) 633bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE); 63457da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 63557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu surf = ctx->DrawSurface; 63657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu if (!_eglIsSurfaceLinked(surf)) 637bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 63857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 639b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SwapInterval(drv, disp, surf, interval); 640b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 641bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 642adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 643adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 644adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6451ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface) 647adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 648bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 649655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 650aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 651aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 652b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 653aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 654bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 655bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu 656bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu /* surface must be bound to current context in EGL 1.4 */ 657bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface) 658bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 659b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 660b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SwapBuffers(drv, disp, surf); 661bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu 662bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 663adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 664adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 665adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6661ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6674aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) 668adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 669655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 670aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 671aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 672b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 673aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 674bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 675f22665df95406567193dee0089f4830664ff4101Chia-I Wu if (disp->Platform != _eglGetNativePlatform()) 676f22665df95406567193dee0089f4830664ff4101Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE); 677b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.CopyBuffers(drv, disp, surf, target); 678b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 679bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 680adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 681adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 682adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6831ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6846c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitClient(void) 685adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 6866c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 6876c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLDisplay *disp; 6882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 689b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 6902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6916c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!ctx) 692bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 6932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 694ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu disp = ctx->Resource.Display; 695655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _eglLockMutex(&disp->Mutex); 696655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 697655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu /* let bad current context imply bad current surface */ 698655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface)) 699bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 700b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 701b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* a valid current context implies an initialized current display */ 702a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu assert(disp->Initialized); 7032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = disp->Driver; 704b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.WaitClient(drv, disp, ctx); 7056c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 706bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 7076c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu} 7086c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 7092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7106c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY 7116c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void) 7126c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{ 7136c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#ifdef EGL_VERSION_1_2 7146c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLThreadInfo *t = _eglGetCurrentThread(); 7156c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu EGLint api_index = t->CurrentAPIIndex; 7166c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu EGLint es_index = _eglConvertApiToIndex(EGL_OPENGL_ES_API); 7176c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu EGLBoolean ret; 7186c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 7196c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (api_index != es_index && _eglIsCurrentThreadDummy()) 720bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE); 7216c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 7226c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu t->CurrentAPIIndex = es_index; 7236c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu ret = eglWaitClient(); 7246c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu t->CurrentAPIIndex = api_index; 7256c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu return ret; 7266c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#else 7276c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu return eglWaitClient(); 7286c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu#endif 729adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 730adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 731adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7321ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 733adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine) 734adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 7356c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 7366c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLDisplay *disp; 7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 738b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 7392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7406c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!ctx) 741bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 742b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 743655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu disp = ctx->Resource.Display; 744655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _eglLockMutex(&disp->Mutex); 745655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 7466c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu /* let bad current context imply bad current surface */ 7476c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!_eglIsContextLinked(ctx) || !_eglIsSurfaceLinked(ctx->DrawSurface)) 748bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 749b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 750b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* a valid current context implies an initialized current display */ 751a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu assert(disp->Initialized); 7522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = disp->Driver; 753b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.WaitNative(drv, disp, engine); 7542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 755bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 756adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 757adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 758adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7591ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY 760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void) 761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 762a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 763b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLDisplay ret; 764b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 765b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY; 766b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 767bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 768adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 769adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 770adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7711ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY 772adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void) 773adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 774adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul _EGLContext *ctx = _eglGetCurrentContext(); 775b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLContext ret; 776b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 777b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = _eglGetContextHandle(ctx); 778b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 779bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 780adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 781adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 782adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7831ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 784adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw) 785adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 78661906631202af855d0742586956ff9f34522a525Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 787b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLint err = EGL_SUCCESS; 78861906631202af855d0742586956ff9f34522a525Chia-I Wu _EGLSurface *surf; 789b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 79061906631202af855d0742586956ff9f34522a525Chia-I Wu 79161906631202af855d0742586956ff9f34522a525Chia-I Wu if (!ctx) 792bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE); 79361906631202af855d0742586956ff9f34522a525Chia-I Wu 79461906631202af855d0742586956ff9f34522a525Chia-I Wu switch (readdraw) { 79561906631202af855d0742586956ff9f34522a525Chia-I Wu case EGL_DRAW: 79661906631202af855d0742586956ff9f34522a525Chia-I Wu surf = ctx->DrawSurface; 79761906631202af855d0742586956ff9f34522a525Chia-I Wu break; 79861906631202af855d0742586956ff9f34522a525Chia-I Wu case EGL_READ: 79961906631202af855d0742586956ff9f34522a525Chia-I Wu surf = ctx->ReadSurface; 80061906631202af855d0742586956ff9f34522a525Chia-I Wu break; 80161906631202af855d0742586956ff9f34522a525Chia-I Wu default: 80261906631202af855d0742586956ff9f34522a525Chia-I Wu surf = NULL; 803b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu err = EGL_BAD_PARAMETER; 80461906631202af855d0742586956ff9f34522a525Chia-I Wu break; 80561906631202af855d0742586956ff9f34522a525Chia-I Wu } 80661906631202af855d0742586956ff9f34522a525Chia-I Wu 807b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = _eglGetSurfaceHandle(surf); 808b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 809bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, err, ret); 810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 811adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 812adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY 814adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void) 815adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 81648822796339cb4a55714dc3f1abbe379562ec538Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 81748822796339cb4a55714dc3f1abbe379562ec538Brian Paul EGLint e = t->LastError; 81875da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu if (!_eglIsCurrentThreadDummy()) 81975da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu t->LastError = EGL_SUCCESS; 820adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul return e; 821adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 822adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 823adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 82495f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I Wu__eglMustCastToProperFunctionPointerType EGLAPIENTRY 82595f8f75ad8bdb1d8e1cc16ea91fed8c407c36abdChia-I WueglGetProcAddress(const char *procname) 826adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8279061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu static const struct { 828adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul const char *name; 829adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul _EGLProc function; 8309061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu } egl_functions[] = { 8319061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu /* extensions only */ 832b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_MESA_screen_surface 8337012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglChooseModeMESA", (_EGLProc) eglChooseModeMESA }, 8347012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglGetModesMESA", (_EGLProc) eglGetModesMESA }, 8357012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglGetModeAttribMESA", (_EGLProc) eglGetModeAttribMESA }, 8361c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl { "eglCopyContextMESA", (_EGLProc) eglCopyContextMESA }, 8377012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglGetScreensMESA", (_EGLProc) eglGetScreensMESA }, 8387012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglCreateScreenSurfaceMESA", (_EGLProc) eglCreateScreenSurfaceMESA }, 83948822796339cb4a55714dc3f1abbe379562ec538Brian Paul { "eglShowScreenSurfaceMESA", (_EGLProc) eglShowScreenSurfaceMESA }, 8407012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglScreenPositionMESA", (_EGLProc) eglScreenPositionMESA }, 8417012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglQueryScreenMESA", (_EGLProc) eglQueryScreenMESA }, 8427012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglQueryScreenSurfaceMESA", (_EGLProc) eglQueryScreenSurfaceMESA }, 8437012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglQueryScreenModeMESA", (_EGLProc) eglQueryScreenModeMESA }, 8447012d01d888d482f2c6ad1180231a482026d213aJon Smirl { "eglQueryModeStringMESA", (_EGLProc) eglQueryModeStringMESA }, 845b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_MESA_screen_surface */ 846a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base 847a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR }, 848a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu { "eglDestroyImageKHR", (_EGLProc) eglDestroyImageKHR }, 849a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */ 85052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region 85152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK }, 85252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif 853adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul { NULL, NULL } 854adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul }; 855adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul EGLint i; 856b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu _EGLProc ret; 8579061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 8589061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu if (!procname) 859bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, NULL); 860b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 861b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = NULL; 8629061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu if (strncmp(procname, "egl", 3) == 0) { 8639061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu for (i = 0; egl_functions[i].name; i++) { 864b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (strcmp(egl_functions[i].name, procname) == 0) { 865b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = egl_functions[i].function; 866b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu break; 867b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu } 868adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul } 869adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul } 870b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (ret) 871bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 872e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul 87357929eda3e876dc60be7060237a669f042be2376Chia-I Wu _eglPreloadDrivers(); 874e787ffcd02cac9085ac69f631cce235d1cad59c9Chia-I Wu 875e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul /* now loop over drivers to query their procs */ 876e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul for (i = 0; i < _eglGlobal.NumDrivers; i++) { 8773e6139d158a054a0dfe8def28bf60201cdb9f385Chia-I Wu _EGLDriver *drv = _eglGlobal.Drivers[i]; 878b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetProcAddress(drv, procname); 879b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (ret) 880b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu break; 881e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul } 882e3805cad0d15ed25ce8f6c5a1f1ea913e5d0986aBrian Paul 883bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 884adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 885adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 886adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8879061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#ifdef EGL_MESA_screen_surface 8889061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 8899061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 890adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/* 891adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_MESA_screen extension 892adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */ 893adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8941ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 895c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PauleglChooseModeMESA(EGLDisplay dpy, EGLScreenMESA screen, 896adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul const EGLint *attrib_list, EGLModeMESA *modes, 897adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul EGLint modes_size, EGLint *num_modes) 898adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 899655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 900aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLScreen *scrn = _eglLookupScreen(screen, disp); 901aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 902b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 903aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 904bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv); 905b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ChooseModeMESA(drv, disp, scrn, attrib_list, 906b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu modes, modes_size, num_modes); 907b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 908bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 909adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 910adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 911adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 9121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 9132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModesMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *modes, 9142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint mode_size, EGLint *num_mode) 915adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 916655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 917aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLScreen *scrn = _eglLookupScreen(screen, disp); 918aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 919b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 920aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 921bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv); 922b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetModesMESA(drv, disp, scrn, modes, mode_size, num_mode); 923b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 924bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 925adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 926adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 927adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 9281ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 9292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetModeAttribMESA(EGLDisplay dpy, EGLModeMESA mode, 9302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 931adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 932655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 933aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLMode *m = _eglLookupMode(mode, disp); 934aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 935b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 936aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 937bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_MODE(disp, m, EGL_FALSE, drv); 938b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetModeAttribMESA(drv, disp, m, attribute, value); 939b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 940bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 941adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 942adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 943adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 9441ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 9452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCopyContextMESA(EGLDisplay dpy, EGLContext source, EGLContext dest, 9462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint mask) 9472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{ 948655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 9492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *source_context = _eglLookupContext(source, disp); 9502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *dest_context = _eglLookupContext(dest, disp); 9512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 952b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 9532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 954bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONTEXT(disp, source_context, EGL_FALSE, drv); 955b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (!dest_context) 956bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE); 9572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 958b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.CopyContextMESA(drv, disp, 959b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu source_context, dest_context, mask); 960b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 961bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 9621c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl} 9631c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl 9641c606a9aa1d1fa79fe5c92f42651385917322d5fJon Smirl 965adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 9662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetScreensMESA(EGLDisplay dpy, EGLScreenMESA *screens, 9672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint max_screens, EGLint *num_screens) 968adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 969655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 970aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 971b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 972aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 973bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 974b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetScreensMESA(drv, disp, screens, max_screens, num_screens); 975b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 976bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 977adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 978adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 979adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 980c22990c29a5cdff89e6e3914aa565acc88a6a407Brian PaulEGLSurface 9812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateScreenSurfaceMESA(EGLDisplay dpy, EGLConfig config, 9822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 983adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 984655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 9852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 9862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 9872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 988b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 9892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 990bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 9912f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 9922f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreateScreenSurfaceMESA(drv, disp, conf, attrib_list); 993b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE; 994b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 995bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 996adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 997adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 998adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 999adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 10002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglShowScreenSurfaceMESA(EGLDisplay dpy, EGLint screen, 10012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLSurface surface, EGLModeMESA mode) 1002adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1003655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 10042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp); 10052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 10062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLMode *m = _eglLookupMode(mode, disp); 10072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 1008b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 10092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1010bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv); 10112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!surf && surface != EGL_NO_SURFACE) 1012bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 10132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!m && mode != EGL_NO_MODE_MESA) 1014bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_MODE_MESA, EGL_FALSE); 1015b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1016b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ShowScreenSurfaceMESA(drv, disp, scrn, surf, m); 10172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1018bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1019adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1020adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1021adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1022adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 10237012d01d888d482f2c6ad1180231a482026d213aJon SmirleglScreenPositionMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLint x, EGLint y) 1024adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1025655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1026aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLScreen *scrn = _eglLookupScreen(screen, disp); 1027aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1028b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1029aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 1030bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv); 1031b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ScreenPositionMESA(drv, disp, scrn, x, y); 1032b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1033bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 10347012d01d888d482f2c6ad1180231a482026d213aJon Smirl} 10357012d01d888d482f2c6ad1180231a482026d213aJon Smirl 10367012d01d888d482f2c6ad1180231a482026d213aJon Smirl 10377012d01d888d482f2c6ad1180231a482026d213aJon SmirlEGLBoolean 10382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenMESA(EGLDisplay dpy, EGLScreenMESA screen, 10392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 10407012d01d888d482f2c6ad1180231a482026d213aJon Smirl{ 1041655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1042aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLScreen *scrn = _eglLookupScreen(screen, disp); 1043aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1044b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1045aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 1046bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv); 1047b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QueryScreenMESA(drv, disp, scrn, attribute, value); 1048b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1049bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1050adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1051adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1052adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1053adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 10542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryScreenSurfaceMESA(EGLDisplay dpy, EGLScreenMESA screen, 10552f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLSurface *surface) 1056adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1057655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 10582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp); 10592f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 10602f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 1061b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 10622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1063bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv); 1064b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QueryScreenSurfaceMESA(drv, disp, scrn, &surf); 1065b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (ret && surface) 10662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu *surface = _eglGetSurfaceHandle(surf); 1067b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1068bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1069adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1070adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1071adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1072adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PaulEGLBoolean 10737012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryScreenModeMESA(EGLDisplay dpy, EGLScreenMESA screen, EGLModeMESA *mode) 1074adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1075655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 10762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLScreen *scrn = _eglLookupScreen((EGLScreenMESA) screen, disp); 10772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 10782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLMode *m; 1079b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 10802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1081bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SCREEN(disp, scrn, EGL_FALSE, drv); 1082b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QueryScreenModeMESA(drv, disp, scrn, &m); 1083b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (ret && mode) 10842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu *mode = m->Handle; 10852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1086bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1087adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1088adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1089adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10907012d01d888d482f2c6ad1180231a482026d213aJon Smirlconst char * 10917012d01d888d482f2c6ad1180231a482026d213aJon SmirleglQueryModeStringMESA(EGLDisplay dpy, EGLModeMESA mode) 10927012d01d888d482f2c6ad1180231a482026d213aJon Smirl{ 1093655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1094aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLMode *m = _eglLookupMode(mode, disp); 1095aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1096b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu const char *ret; 1097aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 1098bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_MODE(disp, m, NULL, drv); 1099b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QueryModeStringMESA(drv, disp, m); 1100b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1101bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 11027012d01d888d482f2c6ad1180231a482026d213aJon Smirl} 11037012d01d888d482f2c6ad1180231a482026d213aJon Smirl 11047012d01d888d482f2c6ad1180231a482026d213aJon Smirl 11059061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu#endif /* EGL_MESA_screen_surface */ 11069061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 11079061d733d3f31293c145cf3b7a0f71c1bfd31989Chia-I Wu 1108b2006a40eb22899d38cd31691640555228e36975Brian Paul/** 1109b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2 1110b2006a40eb22899d38cd31691640555228e36975Brian Paul **/ 1111b2006a40eb22899d38cd31691640555228e36975Brian Paul 1112b2006a40eb22899d38cd31691640555228e36975Brian Paul#ifdef EGL_VERSION_1_2 1113b2006a40eb22899d38cd31691640555228e36975Brian Paul 1114d5078b94323241a6482f54797756116b1c864327Brian Paul 1115d5078b94323241a6482f54797756116b1c864327Brian Paul/** 1116d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including: 1117d5078b94323241a6482f54797756116b1c864327Brian Paul * eglCreateContext() 1118d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentContext() 1119d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentDisplay() 1120d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentSurface() 1121d5078b94323241a6482f54797756116b1c864327Brian Paul * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT) 1122d5078b94323241a6482f54797756116b1c864327Brian Paul * eglWaitClient() 1123d5078b94323241a6482f54797756116b1c864327Brian Paul * eglWaitNative() 1124d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details. 1125d5078b94323241a6482f54797756116b1c864327Brian Paul */ 1126b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean 1127b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api) 1128b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 1129b2006a40eb22899d38cd31691640555228e36975Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 1130b2006a40eb22899d38cd31691640555228e36975Brian Paul 113175da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu if (_eglIsCurrentThreadDummy()) 1132bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE); 113375da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu 113421b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu if (!_eglIsApiValid(api)) 1135bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE); 113621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu 1137310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu t->CurrentAPIIndex = _eglConvertApiToIndex(api); 1138b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1139bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 1140b2006a40eb22899d38cd31691640555228e36975Brian Paul} 1141b2006a40eb22899d38cd31691640555228e36975Brian Paul 1142b2006a40eb22899d38cd31691640555228e36975Brian Paul 1143d5078b94323241a6482f54797756116b1c864327Brian Paul/** 1144d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI(). 1145d5078b94323241a6482f54797756116b1c864327Brian Paul */ 1146d5078b94323241a6482f54797756116b1c864327Brian PaulEGLenum 1147d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void) 1148d5078b94323241a6482f54797756116b1c864327Brian Paul{ 1149d5078b94323241a6482f54797756116b1c864327Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 1150b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLenum ret; 1151b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1152b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */ 1153b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = _eglConvertApiFromIndex(t->CurrentAPIIndex); 1154b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1155bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 1156d5078b94323241a6482f54797756116b1c864327Brian Paul} 1157d5078b94323241a6482f54797756116b1c864327Brian Paul 1158d5078b94323241a6482f54797756116b1c864327Brian Paul 1159b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLSurface 1160b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, 1161b2006a40eb22899d38cd31691640555228e36975Brian Paul EGLClientBuffer buffer, EGLConfig config, 1162b2006a40eb22899d38cd31691640555228e36975Brian Paul const EGLint *attrib_list) 1163b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 1164655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 11652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 11662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 11672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 1168b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 11692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1170bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 11712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 11722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer, 11732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu conf, attrib_list); 1174b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (surf) ? _eglLinkSurface(surf, disp) : EGL_NO_SURFACE; 1175b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1176bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1177b2006a40eb22899d38cd31691640555228e36975Brian Paul} 1178b2006a40eb22899d38cd31691640555228e36975Brian Paul 1179b2006a40eb22899d38cd31691640555228e36975Brian Paul 1180b2006a40eb22899d38cd31691640555228e36975Brian PaulEGLBoolean 1181b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void) 1182b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 118311cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu /* unbind current contexts */ 11842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!_eglIsCurrentThreadDummy()) { 118511cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLThreadInfo *t = _eglGetCurrentThread(); 118645ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu EGLint api_index = t->CurrentAPIIndex; 118711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu EGLint i; 118811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu 118911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu for (i = 0; i < _EGL_API_NUM_APIS; i++) { 119011cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLContext *ctx = t->CurrentContexts[i]; 119111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu if (ctx) { 119211cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLDisplay *disp = ctx->Resource.Display; 1193655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDriver *drv; 1194655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 119545ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu t->CurrentAPIIndex = i; 1196655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 1197655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _eglLockMutex(&disp->Mutex); 1198655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu drv = disp->Driver; 119917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL); 1200655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _eglUnlockMutex(&disp->Mutex); 120111cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu } 12022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 120345ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu 120445ba53324341234144ca02122bf2c0b5ef58c361Chia-I Wu t->CurrentAPIIndex = api_index; 1205b2006a40eb22899d38cd31691640555228e36975Brian Paul } 12062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 120775da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu _eglDestroyCurrentThread(); 1208b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1209bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 1210b2006a40eb22899d38cd31691640555228e36975Brian Paul} 12117012d01d888d482f2c6ad1180231a482026d213aJon Smirl 12127012d01d888d482f2c6ad1180231a482026d213aJon Smirl 1213b2006a40eb22899d38cd31691640555228e36975Brian Paul#endif /* EGL_VERSION_1_2 */ 1214a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1215a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1216a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#ifdef EGL_KHR_image_base 1217a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1218a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1219a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WuEGLImageKHR 1220a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I WueglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 1221a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu EGLClientBuffer buffer, const EGLint *attr_list) 1222a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{ 1223655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1224a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 1225a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDriver *drv; 1226a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLImage *img; 1227b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLImageKHR ret; 1228a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1229bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv); 1230b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (!context && ctx != EGL_NO_CONTEXT) 1231bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 1232a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1233a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu img = drv->API.CreateImageKHR(drv, 1234a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu disp, context, target, buffer, attr_list); 1235b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (img) ? _eglLinkImage(img, disp) : EGL_NO_IMAGE_KHR; 1236b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1237bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1238a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu} 1239a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1240a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1241b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WuEGLBoolean 1242b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I WueglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image) 1243a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{ 1244655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1245a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLImage *img = _eglLookupImage(image, disp); 1246a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDriver *drv; 1247b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1248a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1249bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 1250a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (!img) 1251bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1252a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1253a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _eglUnlinkImage(img); 1254b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroyImageKHR(drv, disp, img); 1255b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1256bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1257a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu} 1258a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1259a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1260a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#endif /* EGL_KHR_image_base */ 126152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 126252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 126352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#ifdef EGL_NOK_swap_region 126452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 126552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergEGLBoolean 126652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface, 126752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg EGLint numRects, const EGLint *rects) 126852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{ 126952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLContext *ctx = _eglGetCurrentContext(); 127052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 127152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLSurface *surf = _eglLookupSurface(surface, disp); 127252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLDriver *drv; 127352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg EGLBoolean ret; 127452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 127552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 127652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 127752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg /* surface must be bound to current context in EGL 1.4 */ 127852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg if (!ctx || !_eglIsContextLinked(ctx) || surf != ctx->DrawSurface) 127952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 128052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 128152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg if (drv->API.SwapBuffersRegionNOK) 128252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects); 128352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg else 128452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg ret = drv->API.SwapBuffers(drv, disp, surf); 128552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 128652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 128752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg} 128852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 128952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg#endif /* EGL_NOK_swap_region */ 1290