eglapi.c revision 0a606a400fe382a9bc726beef269b47f4485d85f
1f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu/************************************************************************** 2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * 3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2008 VMware, Inc. 4f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com> 5f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2010-2011 LunarG, Inc. 6f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * All Rights Reserved. 7f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * 8f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 9f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * copy of this software and associated documentation files (the 10f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * "Software"), to deal in the Software without restriction, including 11f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * without limitation the rights to use, copy, modify, merge, publish, 12f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * distribute, sub license, and/or sell copies of the Software, and to 13f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * permit persons to whom the Software is furnished to do so, subject to 14f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * the following conditions: 15f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * 16f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * The above copyright notice and this permission notice (including the 17f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * next paragraph) shall be included in all copies or substantial portions 18f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * of the Software. 19f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * 20f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * DEALINGS IN THE SOFTWARE. 27f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * 28f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu **************************************************************************/ 29f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu 30f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu 31adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/** 32adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Public EGL API entrypoints 33adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * 34adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Generally, we use the EGLDisplay parameter as a key to lookup the 35adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * appropriate device driver handle, then jump though the driver's 36adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * dispatch table to handle the function. 37adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * 38adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * That allows us the option of supporting multiple, simultaneous, 39adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * heterogeneous hardware devices in the future. 40adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * 41adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * The EGLDisplay, EGLConfig, EGLContext and EGLSurface types are 42aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * opaque handles. Internal objects are linked to a display to 43aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * create the handles. 44adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * 45aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * For each public API entry point, the opaque handles are looked up 46aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * before being dispatched to the drivers. When it fails to look up 47aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * a handle, one of 48aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * 49aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_DISPLAY 50aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_CONFIG 51aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_CONTEXT 52aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_SURFACE 53aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_SCREEN_MESA 54aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_BAD_MODE_MESA 55aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * 56aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * is generated and the driver function is not called. An 57aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * uninitialized EGLDisplay has no driver associated with it. When 58aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * such display is detected, 59aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * 60aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * EGL_NOT_INITIALIZED 61aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * 62aaa1253b09a6a38e7fcd695aa36e89b9d4bd8dfeChia-I Wu * is generated. 63adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * 64bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * Some of the entry points use current display, context, or surface 65bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * implicitly. For such entry points, the implicit objects are also 66bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * checked before calling the driver function. Other than the 67bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * errors listed above, 68bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * 69bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * EGL_BAD_CURRENT_SURFACE 70bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * 71bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * may also be generated. 72bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu * 73adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * Notes on naming conventions: 74adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * 75adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * eglFooBar - public EGL function 76adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGL_FOO_BAR - public EGL token 77adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * EGLDatatype - public EGL datatype 78adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * 79adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _eglFooBar - private EGL function 80adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _EGLDatatype - private EGL datatype, typedef'd struct 81adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * _egl_struct - private EGL struct, non-typedef'd 82adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul * 83adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */ 84adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 85adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 86adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <stdio.h> 87b2006a40eb22899d38cd31691640555228e36975Brian Paul#include <stdlib.h> 88adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include <string.h> 897bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikov#include "c99_compat.h" 90efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov#include "c11/threads.h" 91b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák#include "GL/mesa_glinterop.h" 92efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov#include "eglcompiler.h" 931e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu 943c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace#include "eglglobals.h" 95adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglcontext.h" 96adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldisplay.h" 97adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h" 9894cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h" 99adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egldriver.h" 100adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "eglsurface.h" 1012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu#include "eglconfig.h" 102a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu#include "eglimage.h" 1034eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#include "eglsync.h" 104adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 105adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 106adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul/** 107f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * Macros to help return an API entrypoint. 108655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * 109655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * These macros will unlock the display and record the error code. 110f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */ 111bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_ERROR(disp, err, ret) \ 112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu do { \ 113655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu if (disp) \ 114655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _eglUnlockDisplay(disp); \ 115f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu /* EGL error codes are non-zero */ \ 116f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (err) \ 117d780012cd75c24394b043b107d17eb8199ae2dc7Emil Velikov _eglError(err, __func__); \ 118bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu return ret; \ 119bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu } while (0) 120bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 121bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_SUCCESS(disp, ret) \ 122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_SUCCESS, ret) 123bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 124b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu/* record EGL_SUCCESS only when ret evaluates to true */ 125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define RETURN_EGL_EVAL(disp, ret) \ 126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, (ret) ? EGL_SUCCESS : 0, ret) 127f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 128f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 129bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu/* 130f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu * A bunch of macros and checks to simplify error checking. 131f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu */ 132bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 133bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_DISPLAY(disp, ret, drv) \ 134bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu do { \ 135d780012cd75c24394b043b107d17eb8199ae2dc7Emil Velikov drv = _eglCheckDisplay(disp, __func__); \ 136bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu if (!drv) \ 137bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, 0, ret); \ 138bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu } while (0) 139bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 140bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_OBJECT(disp, type, obj, ret, drv) \ 141bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu do { \ 142d780012cd75c24394b043b107d17eb8199ae2dc7Emil Velikov drv = _eglCheck ## type(disp, obj, __func__); \ 143bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu if (!drv) \ 144bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, 0, ret); \ 145bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu } while (0) 146bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 147bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_SURFACE(disp, surf, ret, drv) \ 148bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_OBJECT(disp, Surface, surf, ret, drv) 149bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 150bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONTEXT(disp, context, ret, drv) \ 151bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_OBJECT(disp, Context, context, ret, drv) 152bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 153bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu#define _EGL_CHECK_CONFIG(disp, conf, ret, drv) \ 154bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_OBJECT(disp, Config, conf, ret, drv) 155bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu 1564eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu#define _EGL_CHECK_SYNC(disp, s, ret, drv) \ 1574eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_OBJECT(disp, Sync, s, ret, drv) 158f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 159f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 1607bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver * 161f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckDisplay(_EGLDisplay *disp, const char *msg) 162f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 163f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!disp) { 164f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_DISPLAY, msg); 165f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 166f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 167f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!disp->Initialized) { 168f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_NOT_INITIALIZED, msg); 169f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 170f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 171f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return disp->Driver; 172f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 173f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 174f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 1757bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver * 176f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckSurface(_EGLDisplay *disp, _EGLSurface *surf, 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 (!surf) { 182f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_SURFACE, msg); 183f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 184f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 185f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 186f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 187f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 188f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 1897bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver * 190f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckContext(_EGLDisplay *disp, _EGLContext *context, const char *msg) 191f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 192f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 193f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 194f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 195f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!context) { 196f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_CONTEXT, msg); 197f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 198f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 199f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 200f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 201f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 202f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 2037bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver * 204f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu_eglCheckConfig(_EGLDisplay *disp, _EGLConfig *conf, const char *msg) 205f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu{ 206f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 207f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!drv) 208f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 209f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu if (!conf) { 210f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu _eglError(EGL_BAD_CONFIG, msg); 211f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return NULL; 212f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu } 213f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu return drv; 214f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu} 215f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 216f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu 2177bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDriver * 2184eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu_eglCheckSync(_EGLDisplay *disp, _EGLSync *s, const char *msg) 2194eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 2204eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv = _eglCheckDisplay(disp, msg); 2214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu if (!drv) 2224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu return NULL; 2234eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu if (!s) { 2244eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _eglError(EGL_BAD_PARAMETER, msg); 2254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu return NULL; 2264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu } 2274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu return drv; 2284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 2294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 2304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 231f3e03e1277839cddc35e0cc3427a7972bc17a10aChia-I Wu/** 232655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Lookup and lock a display. 233655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */ 2347bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline _EGLDisplay * 235655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglLockDisplay(EGLDisplay display) 236655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{ 237655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *dpy = _eglLookupDisplay(display); 238655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu if (dpy) 239efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov mtx_lock(&dpy->Mutex); 240655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu return dpy; 241655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu} 242655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 243655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 244655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/** 245655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu * Unlock a display. 246655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu */ 2477bd1693877e4de9aaf8f6776649fc48db54ec82bEmil Velikovstatic inline void 248655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu_eglUnlockDisplay(_EGLDisplay *dpy) 249655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu{ 250efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov mtx_unlock(&dpy->Mutex); 251655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu} 252655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 2536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brennemanstatic EGLBoolean 2546a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman_eglSetFuncName(const char *funcName, _EGLDisplay *disp, EGLenum objectType, _EGLResource *object) 2556a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman{ 2566a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGLThreadInfo *thr = _eglGetCurrentThread(); 2576a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman if (!_eglIsCurrentThreadDummy()) { 2586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman thr->CurrentFuncName = funcName; 2596a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman thr->CurrentObjectLabel = NULL; 2606a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2616a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman if (objectType == EGL_OBJECT_THREAD_KHR) 2626a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman thr->CurrentObjectLabel = thr->Label; 2636a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman else if (objectType == EGL_OBJECT_DISPLAY_KHR && disp) 2646a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman thr->CurrentObjectLabel = disp->Label; 2656a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman else if (object) 2666a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman thr->CurrentObjectLabel = object->Label; 2676a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2686a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman return EGL_TRUE; 2696a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman } 2706a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2716a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _eglDebugReportFull(EGL_BAD_ALLOC, funcName, funcName, 2726a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman EGL_DEBUG_MSG_CRITICAL_KHR, NULL, NULL); 2736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman return EGL_FALSE; 2746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman} 2756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2766a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman#define _EGL_FUNC_START(disp, objectType, object, ret) \ 2776a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman do { \ 2786a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman if (!_eglSetFuncName(__func__, disp, objectType, (_EGLResource *) object)) { \ 2796a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman if (disp) \ 2806a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _eglUnlockDisplay(disp); \ 2816a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman return ret; \ 2826a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman } \ 2836a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman } while(0) 284655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 2853e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace/** 2863e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace * Convert an attribute list from EGLint[] to EGLAttrib[]. 2873e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace * 2883e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace * Return an EGL error code. The output parameter out_attrib_list is modified 2893e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace * only on success. 2903e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace */ 2913e0d575a6d727c4334b783c443a5e1980dca43b4Chad VersaceEGLint 2923e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace_eglConvertIntsToAttribs(const EGLint *int_list, EGLAttrib **out_attrib_list) 2933e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace{ 2943e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace size_t len = 0; 2953e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace EGLAttrib *attrib_list; 2963e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 2973e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace if (int_list) { 2983e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace while (int_list[2*len] != EGL_NONE) 2993e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace ++len; 3003e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace } 3013e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 3023e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace if (len == 0) { 3033e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace *out_attrib_list = NULL; 3043e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace return EGL_SUCCESS; 3053e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace } 3063e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 3073e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace if (2*len + 1 > SIZE_MAX / sizeof(EGLAttrib)) 3083e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace return EGL_BAD_ALLOC; 3093e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 3103e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace attrib_list = malloc((2*len + 1) * sizeof(EGLAttrib)); 3113e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace if (!attrib_list) 3123e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace return EGL_BAD_ALLOC; 3133e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 3143e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace for (size_t i = 0; i < len; ++i) { 3153e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace attrib_list[2*i + 0] = int_list[2*i + 0]; 3163e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace attrib_list[2*i + 1] = int_list[2*i + 1]; 3173e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace } 3183e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 3193e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace attrib_list[2*len] = EGL_NONE; 3203e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 3213e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace *out_attrib_list = attrib_list; 3223e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace return EGL_SUCCESS; 3233e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace} 3243e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 3253e0d575a6d727c4334b783c443a5e1980dca43b4Chad Versace 326515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšákstatic EGLint * 327515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák_eglConvertAttribsToInt(const EGLAttrib *attr_list) 328515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák{ 329515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák EGLint *int_attribs = NULL; 330515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 331515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák /* Convert attributes from EGLAttrib[] to EGLint[] */ 332515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák if (attr_list) { 333515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák int i, size = 0; 334515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 335515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák while (attr_list[size] != EGL_NONE) 336515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák size += 2; 337515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 338515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák size += 1; /* add space for EGL_NONE */ 339515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 340515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák int_attribs = calloc(size, sizeof(int_attribs[0])); 341515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák if (!int_attribs) 342515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák return NULL; 343515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 344515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák for (i = 0; i < size; i++) 345515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák int_attribs[i] = attr_list[i]; 346515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák } 347515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák return int_attribs; 348515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák} 349515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 350515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 351655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu/** 3526052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the first EGL function that an application calls. 353db5ce8b3843a03c6f83a02a79f033d7e74784dd5Chia-I Wu * It associates a private _EGLDisplay object to the native display. 354adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul */ 3551ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY 3564aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglGetDisplay(EGLNativeDisplayType nativeDisplay) 357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 3586d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace _EGLPlatformType plat; 3596d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace _EGLDisplay *dpy; 3606d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace void *native_display_ptr; 3616d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace 3626a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY); 3636a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 3646d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace STATIC_ASSERT(sizeof(void*) == sizeof(nativeDisplay)); 3656d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace native_display_ptr = (void*) nativeDisplay; 3666d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace 3676d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace plat = _eglGetNativePlatform(native_display_ptr); 3686d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace dpy = _eglFindDisplay(plat, native_display_ptr); 369721ba15bf4596b2e9589e7656005b387724875c3Brian Paul return _eglGetDisplayHandle(dpy); 370adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 371adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 372017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brennemanstatic EGLDisplay 373017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman_eglGetPlatformDisplayCommon(EGLenum platform, void *native_display, 374017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman const EGLint *attrib_list) 375468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 376468cc866b4b308cee40470f06b31002c6c56da96Chad Versace _EGLDisplay *dpy; 377468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 378468cc866b4b308cee40470f06b31002c6c56da96Chad Versace switch (platform) { 379468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_X11_PLATFORM 380468cc866b4b308cee40470f06b31002c6c56da96Chad Versace case EGL_PLATFORM_X11_EXT: 381468cc866b4b308cee40470f06b31002c6c56da96Chad Versace dpy = _eglGetX11Display((Display*) native_display, attrib_list); 382468cc866b4b308cee40470f06b31002c6c56da96Chad Versace break; 383468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif 384468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_DRM_PLATFORM 385468cc866b4b308cee40470f06b31002c6c56da96Chad Versace case EGL_PLATFORM_GBM_MESA: 386468cc866b4b308cee40470f06b31002c6c56da96Chad Versace dpy = _eglGetGbmDisplay((struct gbm_device*) native_display, 387468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 388468cc866b4b308cee40470f06b31002c6c56da96Chad Versace break; 389468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif 390468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_WAYLAND_PLATFORM 391468cc866b4b308cee40470f06b31002c6c56da96Chad Versace case EGL_PLATFORM_WAYLAND_EXT: 392468cc866b4b308cee40470f06b31002c6c56da96Chad Versace dpy = _eglGetWaylandDisplay((struct wl_display*) native_display, 393468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 394468cc866b4b308cee40470f06b31002c6c56da96Chad Versace break; 395468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif 396468cc866b4b308cee40470f06b31002c6c56da96Chad Versace default: 397468cc866b4b308cee40470f06b31002c6c56da96Chad Versace RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL); 398468cc866b4b308cee40470f06b31002c6c56da96Chad Versace } 399468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 400468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglGetDisplayHandle(dpy); 401468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 402adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 403017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brennemanstatic EGLDisplay EGLAPIENTRY 404017946b7247ea7c36219b44dfc118ccad4da7d1dKyle BrennemaneglGetPlatformDisplayEXT(EGLenum platform, void *native_display, 405017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman const EGLint *attrib_list) 406017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman{ 4076a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY); 408017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman return _eglGetPlatformDisplayCommon(platform, native_display, attrib_list); 409017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman} 410017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman 411820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLDisplay EGLAPIENTRY 412820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglGetPlatformDisplay(EGLenum platform, void *native_display, 413820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák const EGLAttrib *attrib_list) 414820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{ 415820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák EGLDisplay display; 416017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman EGLint *int_attribs; 417820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 4186a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY); 4196a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 420017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman int_attribs = _eglConvertAttribsToInt(attrib_list); 421820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák if (attrib_list && !int_attribs) 422820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, NULL); 423820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 424017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman display = _eglGetPlatformDisplayCommon(platform, native_display, int_attribs); 425820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák free(int_attribs); 426820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák return display; 427820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák} 428820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 4296052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/** 430dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * Copy the extension into the string and update the string pointer. 431dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner */ 432dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic EGLint 433dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglAppendExtension(char **str, const char *ext) 434dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{ 435dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner char *s = *str; 436dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner size_t len = strlen(ext); 437dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 438dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner if (s) { 439dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner memcpy(s, ext, len); 440dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner s[len++] = ' '; 441dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner s[len] = '\0'; 442dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 443dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner *str += len; 444dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner } 445dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner else { 446dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner len++; 447dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner } 448dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 449dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner return (EGLint) len; 450dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner} 451dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 452dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner/** 453dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * Examine the individual extension enable/disable flags and recompute 454dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * the driver's Extensions string. 455dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner */ 456dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic void 457dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglCreateExtensionsString(_EGLDisplay *dpy) 458dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{ 459dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner#define _EGL_CHECK_EXTENSION(ext) \ 460dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner do { \ 461dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner if (dpy->Extensions.ext) { \ 462dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _eglAppendExtension(&exts, "EGL_" #ext); \ 463dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner assert(exts <= dpy->ExtensionsString + _EGL_MAX_EXTENSIONS_LEN); \ 464dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner } \ 465dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner } while (0) 466dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 467dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner char *exts = dpy->ExtensionsString; 468dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 46932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák /* Please keep these sorted alphabetically. */ 4708975527f58afd4af77966c6e46b485fc04008779Rob Herring _EGL_CHECK_EXTENSION(ANDROID_framebuffer_target); 47132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(ANDROID_image_native_buffer); 472e21e81aa1885287e438970429d44abb8b3dabb96Rob Herring _EGL_CHECK_EXTENSION(ANDROID_recordable); 473dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 47432aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(CHROMIUM_sync_control); 475dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 47632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(EXT_buffer_age); 47732aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(EXT_create_context_robustness); 47832aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import); 47932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage); 480dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 48132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_cl_event2); 48232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_create_context); 48332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_fence_sync); 484dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(KHR_get_all_proc_addresses); 48532aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_gl_colorspace); 48632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_gl_renderbuffer_image); 487dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(KHR_gl_texture_2D_image); 488dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(KHR_gl_texture_3D_image); 48932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_gl_texture_cubemap_image); 49032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák if (dpy->Extensions.KHR_image_base && dpy->Extensions.KHR_image_pixmap) 49132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _eglAppendExtension(&exts, "EGL_KHR_image"); 49232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_image_base); 49332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_image_pixmap); 494d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson _EGL_CHECK_EXTENSION(KHR_no_config_context); 495dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(KHR_reusable_sync); 49632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_surfaceless_context); 4970a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom if (dpy->Extensions.EXT_swap_buffers_with_damage) 4980a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _eglAppendExtension(&exts, "EGL_KHR_swap_buffers_with_damage"); 499a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák _EGL_CHECK_EXTENSION(KHR_wait_sync); 500dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 501d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson if (dpy->Extensions.KHR_no_config_context) 502d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson _eglAppendExtension(&exts, "EGL_MESA_configless_context"); 50332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(MESA_drm_image); 50432aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(MESA_image_dma_buf_export); 505dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 506dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(NOK_swap_region); 507dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(NOK_texture_from_pixmap); 508dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 509dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(NV_post_sub_buffer); 5108f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 51132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(WL_bind_wayland_display); 51232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image); 51332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák 514dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner#undef _EGL_CHECK_EXTENSION 515dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner} 516dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 517dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic void 518dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglCreateAPIsString(_EGLDisplay *dpy) 519dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{ 520dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner if (dpy->ClientAPIs & EGL_OPENGL_BIT) 521dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner strcat(dpy->ClientAPIsString, "OpenGL "); 522dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 52321edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova if (dpy->ClientAPIs & EGL_OPENGL_ES_BIT || 52421edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova dpy->ClientAPIs & EGL_OPENGL_ES2_BIT || 52521edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova dpy->ClientAPIs & EGL_OPENGL_ES3_BIT_KHR) { 526dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner strcat(dpy->ClientAPIsString, "OpenGL_ES "); 52721edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova } 528dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 529dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner if (dpy->ClientAPIs & EGL_OPENVG_BIT) 530dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner strcat(dpy->ClientAPIsString, "OpenVG "); 531dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 532dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner assert(strlen(dpy->ClientAPIsString) < sizeof(dpy->ClientAPIsString)); 533dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner} 534dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 535efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšákstatic void 536efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák_eglComputeVersion(_EGLDisplay *disp) 537efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák{ 5380e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák disp->Version = 14; 539a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák 540a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák if (disp->Extensions.KHR_fence_sync && 541a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_cl_event2 && 542a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_wait_sync && 543a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_image_base && 544a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_texture_2D_image && 545a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_texture_3D_image && 546a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_texture_cubemap_image && 547a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_renderbuffer_image && 548a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_create_context && 549a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.EXT_create_context_robustness && 550a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_get_all_proc_addresses && 551a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_colorspace && 552a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_surfaceless_context) 553a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Version = 15; 554efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák} 555dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 556dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner/** 5576052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls. 5586052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver. 5596052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */ 5601ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 561adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 562adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 563655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 5647e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White 5656a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 5666a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 5672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!disp) 568bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE); 5692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 570a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (!disp->Initialized) { 571f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu if (!_eglMatchDriver(disp, EGL_FALSE)) 572f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE); 5732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 574310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu /* limit to APIs supported by core */ 575a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu disp->ClientAPIs &= _EGL_API_ALL_BITS; 5767e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace 5777e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace /* EGL_KHR_get_all_proc_addresses is a corner-case extension. The spec 5787e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * classifies it as an EGL display extension, though conceptually it's an 5797e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL client extension. 5807e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * 5817e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * From the EGL_KHR_get_all_proc_addresses spec: 5827e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * 5837e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * The EGL implementation must expose the name 5847e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL_KHR_client_get_all_proc_addresses if and only if it exposes 5857e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL_KHR_get_all_proc_addresses and supports 5867e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL_EXT_client_extensions. 5877e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * 5887e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * Mesa unconditionally exposes both client extensions mentioned above, 5897e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * so the spec requires that each EGLDisplay unconditionally expose 5907e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL_KHR_get_all_proc_addresses also. 5917e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace */ 5927e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace disp->Extensions.KHR_get_all_proc_addresses = EGL_TRUE; 593dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 594efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák _eglComputeVersion(disp); 595dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _eglCreateExtensionsString(disp); 596dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _eglCreateAPIsString(disp); 5973593f37fd7b599e217bd1f894ac671a14a058b8dEmil Velikov snprintf(disp->VersionString, sizeof(disp->VersionString), 5980e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák "%d.%d (%s)", disp->Version / 10, disp->Version % 10, 599dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner disp->Driver->Name); 600adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul } 6012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6022f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu /* Update applications version of major and minor if not NULL */ 6032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if ((major != NULL) && (minor != NULL)) { 6040e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák *major = disp->Version / 10; 6050e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák *minor = disp->Version % 10; 6062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 6072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 608bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 609adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 610adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 611adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6121ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 613adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy) 614adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 615655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 6162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6176a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 6186a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 6192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!disp) 620bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE); 6212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 622a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (disp->Initialized) { 623a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu _EGLDriver *drv = disp->Driver; 624a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu 625ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu drv->API.Terminate(drv, disp); 626a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu /* do not reset disp->Driver */ 62737e3a116f8ae09d0fa894d126d081a1af24ec14fDave Airlie disp->ClientAPIsString[0] = 0; 628a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu disp->Initialized = EGL_FALSE; 6292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 6302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 631bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 6322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu} 6332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6351ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY 636adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name) 637adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 6383c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace _EGLDisplay *disp; 639aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 640aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 6413c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) { 6423c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace RETURN_EGL_SUCCESS(NULL, _eglGlobal.ClientExtensionString); 6433c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace } 6443c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace 6453c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace disp = _eglLockDisplay(dpy); 6466a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, NULL); 647bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, NULL, drv); 648b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 6496c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner switch (name) { 6506c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner case EGL_VENDOR: 6516c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_SUCCESS(disp, _EGL_VENDOR_STRING); 6526c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner case EGL_VERSION: 6536c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_SUCCESS(disp, disp->VersionString); 6546c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner case EGL_EXTENSIONS: 6556c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_SUCCESS(disp, disp->ExtensionsString); 6566c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner case EGL_CLIENT_APIS: 6576c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_SUCCESS(disp, disp->ClientAPIsString); 6586c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner default: 6596c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL); 6606c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner } 661adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 662adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 663adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs, 6662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint config_size, EGLint *num_config) 667adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 668655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 669aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 670b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 671aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 6726a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 6736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 674bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 675b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config); 676b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 677bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 678adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 679adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 680adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6811ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, 6832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint config_size, EGLint *num_config) 684adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 685655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 686aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 687b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 688aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 6896a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 6906a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 691bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 692b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs, 6932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu config_size, num_config); 694b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 695bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 696adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 697adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 698adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6991ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 7002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 7012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 702adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 703655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 7042f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 7052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 706b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 7072f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7086a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 7096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 710bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv); 711b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value); 712b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 713bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 714adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 715adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 716adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7171ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY 7182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list, 7192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 7202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{ 721655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 7222f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 7232f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *share = _eglLookupContext(share_list, disp); 7242f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 7252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context; 726b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLContext ret; 7272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7286a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_CONTEXT); 7296a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 7306b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv); 7316b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 732d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson if (!config && !disp->Extensions.KHR_no_config_context) 7334b17dff3e5128bef67ea79d20624e878c3b48729Neil Roberts RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT); 734b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg 735b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (!share && share_list != EGL_NO_CONTEXT) 736bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT); 7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu context = drv->API.CreateContext(drv, disp, conf, share, attrib_list); 7394ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT; 740b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 741bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 742adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 743adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 744adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7451ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 746adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx) 747adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 748655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 749aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 750aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 751b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 752aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 7536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE); 7546a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 755bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv); 7562f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglUnlinkContext(context); 757b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroyContext(drv, disp, context); 758b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 759bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 762adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 7642f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, 7652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLContext ctx) 766adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 767655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 7682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 7692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *draw_surf = _eglLookupSurface(draw, disp); 7702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *read_surf = _eglLookupSurface(read, disp); 7712f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 772b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 7732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE); 7756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 77617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (!disp) 777bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE); 77817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu drv = disp->Driver; 77917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu 78017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu /* display is allowed to be uninitialized under certain condition */ 78117330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (!disp->Initialized) { 78217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE || 78317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu ctx != EGL_NO_CONTEXT) 784bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE); 78517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu } 7862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 787bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 78817330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu 7892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!context && ctx != EGL_NO_CONTEXT) 790bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE); 7916b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!draw_surf || !read_surf) { 7920ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor /* From the EGL 1.4 (20130211) spec: 7930ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor * 7940ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor * To release the current context without assigning a new one, set ctx 7950ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor * to EGL_NO_CONTEXT and set draw and read to EGL_NO_SURFACE. 7960ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor */ 7970ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor if (!disp->Extensions.KHR_surfaceless_context && ctx != EGL_NO_CONTEXT) 7986b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 7996b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 8006b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if ((!draw_surf && draw != EGL_NO_SURFACE) || 8016b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu (!read_surf && read != EGL_NO_SURFACE)) 8026b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 8036b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (draw_surf || read_surf) 8046b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE); 8056b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu } 8062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 807b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context); 808b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 809bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 810adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 811adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 812adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8131ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 8142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx, 8152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 816adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 817655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 818aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 819aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 820b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 821aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 8226a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE); 8236a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 824bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv); 825b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QueryContext(drv, disp, context, attribute, value); 826b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 827bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 828adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 829adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 830adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 831468cc866b4b308cee40470f06b31002c6c56da96Chad Versacestatic EGLSurface 832468cc866b4b308cee40470f06b31002c6c56da96Chad Versace_eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config, 833468cc866b4b308cee40470f06b31002c6c56da96Chad Versace void *native_window, const EGLint *attrib_list) 834adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 8362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 8372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 838b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 8392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 840bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 84191ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh 84291ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh if (native_window == NULL) 84391ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 84491ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh 845468cc866b4b308cee40470f06b31002c6c56da96Chad Versace surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window, 8466d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace attrib_list); 8474ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; 848b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 849bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 850adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 851adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 852adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8531ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 854468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, 855468cc866b4b308cee40470f06b31002c6c56da96Chad Versace EGLNativeWindowType window, const EGLint *attrib_list) 856adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 857655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 8586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 8596a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 860468cc866b4b308cee40470f06b31002c6c56da96Chad Versace STATIC_ASSERT(sizeof(void*) == sizeof(window)); 861468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglCreateWindowSurfaceCommon(disp, config, (void*) window, 862468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 863468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 864468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 8657d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brennemanstatic void * 8667d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle BrennemanfixupNativeWindow(_EGLDisplay *disp, void *native_window) 867468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 868468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_X11_PLATFORM 869468cc866b4b308cee40470f06b31002c6c56da96Chad Versace if (disp->Platform == _EGL_PLATFORM_X11 && native_window != NULL) { 870468cc866b4b308cee40470f06b31002c6c56da96Chad Versace /* The `native_window` parameter for the X11 platform differs between 871468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * eglCreateWindowSurface() and eglCreatePlatformPixmapSurfaceEXT(). In 872468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * eglCreateWindowSurface(), the type of `native_window` is an Xlib 873468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * `Window`. In eglCreatePlatformWindowSurfaceEXT(), the type is 874468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * `Window*`. Convert `Window*` to `Window` because that's what 875468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * dri2_x11_create_window_surface() expects. 876468cc866b4b308cee40470f06b31002c6c56da96Chad Versace */ 8777d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman return (void *)(* (Window*) native_window); 878468cc866b4b308cee40470f06b31002c6c56da96Chad Versace } 879468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif 8807d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman return native_window; 8817d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman} 8827d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman 8837d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brennemanstatic EGLSurface EGLAPIENTRY 8847d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle BrennemaneglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, 8857d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman void *native_window, 8867d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman const EGLint *attrib_list) 8877d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman{ 8887d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 8897d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman 8907d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman native_window = fixupNativeWindow(disp, native_window); 891468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 8926a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 893468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglCreateWindowSurfaceCommon(disp, config, native_window, 894468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 895468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 896468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 897468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 898820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLSurface EGLAPIENTRY 899820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, 900820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák void *native_window, 901820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák const EGLAttrib *attrib_list) 902820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{ 9037d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 904820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák EGLSurface surface; 9056a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman EGLint *int_attribs; 9066a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 9076a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 908820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 9096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman int_attribs = _eglConvertAttribsToInt(attrib_list); 910820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák if (attrib_list && !int_attribs) 9116a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE); 912820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 9137d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman native_window = fixupNativeWindow(disp, native_window); 9147d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman surface = _eglCreateWindowSurfaceCommon(disp, config, native_window, 9157d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman int_attribs); 916820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák free(int_attribs); 917820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák return surface; 918820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák} 919820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 9208cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brennemanstatic void * 9218cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle BrennemanfixupNativePixmap(_EGLDisplay *disp, void *native_pixmap) 9228cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman{ 9238cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman#ifdef HAVE_X11_PLATFORM 9248cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman /* The `native_pixmap` parameter for the X11 platform differs between 9258cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * eglCreatePixmapSurface() and eglCreatePlatformPixmapSurfaceEXT(). In 9268cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * eglCreatePixmapSurface(), the type of `native_pixmap` is an Xlib 9278cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * `Pixmap`. In eglCreatePlatformPixmapSurfaceEXT(), the type is 9288cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * `Pixmap*`. Convert `Pixmap*` to `Pixmap` because that's what 9298cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * dri2_x11_create_pixmap_surface() expects. 9308cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman */ 9318cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman if (disp->Platform == _EGL_PLATFORM_X11 && native_pixmap != NULL) 9328cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman return (void *)(* (Pixmap*) native_pixmap); 9338cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman#endif 9348cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman return native_pixmap; 9358cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman} 936820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 937468cc866b4b308cee40470f06b31002c6c56da96Chad Versacestatic EGLSurface 938468cc866b4b308cee40470f06b31002c6c56da96Chad Versace_eglCreatePixmapSurfaceCommon(_EGLDisplay *disp, EGLConfig config, 939468cc866b4b308cee40470f06b31002c6c56da96Chad Versace void *native_pixmap, const EGLint *attrib_list) 940468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 9412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 9422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 9432f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 944b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 9452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 946bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 947468cc866b4b308cee40470f06b31002c6c56da96Chad Versace surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap, 9486d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace attrib_list); 9494ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; 950b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 951bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 952adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 953adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 954adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 9551ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 956468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, 957468cc866b4b308cee40470f06b31002c6c56da96Chad Versace EGLNativePixmapType pixmap, const EGLint *attrib_list) 958468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 959468cc866b4b308cee40470f06b31002c6c56da96Chad Versace _EGLDisplay *disp = _eglLockDisplay(dpy); 9606a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 9616a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 962468cc866b4b308cee40470f06b31002c6c56da96Chad Versace STATIC_ASSERT(sizeof(void*) == sizeof(pixmap)); 963468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglCreatePixmapSurfaceCommon(disp, config, (void*) pixmap, 964468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 965468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 966468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 967e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLSurface EGLAPIENTRY 968468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, 969468cc866b4b308cee40470f06b31002c6c56da96Chad Versace void *native_pixmap, 970468cc866b4b308cee40470f06b31002c6c56da96Chad Versace const EGLint *attrib_list) 971468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 972468cc866b4b308cee40470f06b31002c6c56da96Chad Versace _EGLDisplay *disp = _eglLockDisplay(dpy); 973468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 9746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 9758cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman native_pixmap = fixupNativePixmap(disp, native_pixmap); 976468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap, 977468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 978468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 979468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 980468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 981468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceEGLSurface EGLAPIENTRY 982820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, 983820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák void *native_pixmap, 984820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák const EGLAttrib *attrib_list) 985820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{ 9868cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 987820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák EGLSurface surface; 9886a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman EGLint *int_attribs; 9896a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 9906a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 991820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 9926a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman int_attribs = _eglConvertAttribsToInt(attrib_list); 993820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák if (attrib_list && !int_attribs) 9946a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE); 995820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 9968cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman native_pixmap = fixupNativePixmap(disp, native_pixmap); 9978cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman surface = _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap, 9988cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman int_attribs); 999820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák free(int_attribs); 1000820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák return surface; 1001820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák} 1002820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 1003820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 1004820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLSurface EGLAPIENTRY 10052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, 10062f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 1007adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1008655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 10092f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 10102f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 10112f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 1012b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 10132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 10146a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 1015bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 10162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 10172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list); 10184ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; 1019b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1020bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1021adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1022adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1023adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10241ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1025adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface) 1026adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1027655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1028aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1029aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1030b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1031aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 10326a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1033bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 10342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglUnlinkSurface(surf); 1035b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroySurface(drv, disp, surf); 1036b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1037bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1038adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1039adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10401ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 10412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface, 10422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 1043adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1044655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1045aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1046aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1047b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1048aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 10496a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1050bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1051b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QuerySurface(drv, disp, surf, attribute, value); 1052b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1053bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1054adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1055adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10561ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 10572f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, 10582f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint value) 1059adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1060655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1061aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1062aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1063b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1064aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 10656a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1066bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1067b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value); 1068b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1069bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1070adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1071adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1072adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10731ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1074adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1075adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1076655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1077aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1078aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1079b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1080aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 10816a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1082bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1083b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.BindTexImage(drv, disp, surf, buffer); 1084b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1085bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1086adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1087adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1088adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10891ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1090adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1091adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1092655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1093aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1094aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1095b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1096aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 10976a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1098bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1099b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer); 1100b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1101bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1102adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1103adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1104adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 11051ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1106adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval) 1107adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1108655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 110957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 11106a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGLSurface *surf = ctx ? ctx->DrawSurface : NULL; 1111aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1112b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1113aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 11146a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1115bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 111657da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 1117d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1118d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu ctx->Resource.Display != disp) 1119bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE); 112057da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 1121d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE) 1122bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 112357da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 1124b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SwapInterval(drv, disp, surf, interval); 1125b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1126bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1127adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1128adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1129adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 11301ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 11312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface) 1132adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1133bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 1134655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1135aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1136aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1137b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1138aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 11396a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1140bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1141bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu 1142bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu /* surface must be bound to current context in EGL 1.4 */ 1143400b833592d9aad7b2c4627a897380642d52189fAlexander von Gluck IV #ifndef _EGL_BUILT_IN_DRIVER_HAIKU 1144d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1145d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu surf != ctx->DrawSurface) 1146bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 1147400b833592d9aad7b2c4627a897380642d52189fAlexander von Gluck IV #endif 1148b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1149b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SwapBuffers(drv, disp, surf); 1150bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu 1151bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1152adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1153adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1154adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 11550a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean 11560a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageCommon(_EGLDisplay *disp, _EGLSurface *surf, 11570a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom EGLint *rects, EGLint n_rects) 11586425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg{ 11596425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg _EGLContext *ctx = _eglGetCurrentContext(); 11606425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg _EGLDriver *drv; 11616425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg EGLBoolean ret; 11626425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 11636425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 11646425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 11656425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg /* surface must be bound to current context in EGL 1.4 */ 11666425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 11676425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg surf != ctx->DrawSurface) 11686425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 11696425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 11706425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg if ((n_rects > 0 && rects == NULL) || n_rects < 0) 11716425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 11726425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 11736425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg ret = drv->API.SwapBuffersWithDamageEXT(drv, disp, surf, rects, n_rects); 11746425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 11756425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg RETURN_EGL_EVAL(disp, ret); 11766425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg} 11776425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 11780a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean EGLAPIENTRY 11790a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageEXT(EGLDisplay dpy, EGLSurface surface, 11800a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom EGLint *rects, EGLint n_rects) 11810a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom{ 11820a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGLDisplay *disp = _eglLockDisplay(dpy); 11830a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGLSurface *surf = _eglLookupSurface(surface, disp); 11840a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 11850a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom return eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects); 11860a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom} 11870a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom 11880a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean EGLAPIENTRY 11890a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface, 11900a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom EGLint *rects, EGLint n_rects) 11910a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom{ 11920a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGLDisplay *disp = _eglLockDisplay(dpy); 11930a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGLSurface *surf = _eglLookupSurface(surface, disp); 11940a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 11950a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom return eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects); 11960a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom} 11970a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom 11981ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 11994aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) 1200adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1201655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1202aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1203aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1204b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 12056d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace void *native_pixmap_ptr; 12066d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace 12076a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 12086d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace STATIC_ASSERT(sizeof(void*) == sizeof(target)); 12096d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace native_pixmap_ptr = (void*) target; 1210aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 1211bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 121285fe9484945cb57ffd49df248b0e5057eba6af04Benjamin Franzke if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay)) 1213f22665df95406567193dee0089f4830664ff4101Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE); 12146d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace ret = drv->API.CopyBuffers(drv, disp, surf, native_pixmap_ptr); 1215b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1216bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1217adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1218adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1219adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 122082a2e2cb5024c37a1779594320f23f225a83c79dKyle Brennemanstatic EGLBoolean 122182a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman_eglWaitClientCommon(void) 1222adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 12236c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 12246c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLDisplay *disp; 12252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 1226b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 12272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 12286c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!ctx) 1229bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 12302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1231ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu disp = ctx->Resource.Display; 1232efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov mtx_lock(&disp->Mutex); 1233655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 1234655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu /* let bad current context imply bad current surface */ 1235d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1236d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE) 1237bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 1238b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1239b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* a valid current context implies an initialized current display */ 1240a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu assert(disp->Initialized); 12412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = disp->Driver; 1242b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.WaitClient(drv, disp, ctx); 12436c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 1244bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 12456c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu} 12466c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 124782a2e2cb5024c37a1779594320f23f225a83c79dKyle BrennemanEGLBoolean EGLAPIENTRY 124882a2e2cb5024c37a1779594320f23f225a83c79dKyle BrennemaneglWaitClient(void) 124982a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman{ 12506a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext(), EGL_FALSE); 125182a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman return _eglWaitClientCommon(); 125282a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman} 12532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 12546c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY 12556c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void) 12566c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{ 12576e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman /* Since we only support OpenGL and GLES, eglWaitGL is equivalent to eglWaitClient. */ 12586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext(), EGL_FALSE); 125982a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman return _eglWaitClientCommon(); 1260adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1261adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1262adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 12631ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1264adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine) 1265adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 12666c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 12676c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLDisplay *disp; 12682f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 1269b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 12702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 12716c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!ctx) 1272bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 1273b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 12746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE); 12756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1276655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu disp = ctx->Resource.Display; 1277efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov mtx_lock(&disp->Mutex); 1278655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 12796c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu /* let bad current context imply bad current surface */ 1280d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1281d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE) 1282bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 1283b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1284b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* a valid current context implies an initialized current display */ 1285a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu assert(disp->Initialized); 12862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = disp->Driver; 1287b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.WaitNative(drv, disp, engine); 12882f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1289bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1290adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1291adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1292adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 12931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY 1294adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void) 1295adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1296a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 1297b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLDisplay ret; 1298b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1299b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY; 1300b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1301bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 1302adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1303adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1304adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 13051ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY 1306adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void) 1307adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1308adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul _EGLContext *ctx = _eglGetCurrentContext(); 1309b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLContext ret; 1310b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1311b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = _eglGetContextHandle(ctx); 1312b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1313bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 1314adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1315adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1316adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 13171ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 1318adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw) 1319adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 132061906631202af855d0742586956ff9f34522a525Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 1321b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLint err = EGL_SUCCESS; 132261906631202af855d0742586956ff9f34522a525Chia-I Wu _EGLSurface *surf; 1323b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 132461906631202af855d0742586956ff9f34522a525Chia-I Wu 13256a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_NO_SURFACE); 13266a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 132761906631202af855d0742586956ff9f34522a525Chia-I Wu if (!ctx) 1328bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE); 132961906631202af855d0742586956ff9f34522a525Chia-I Wu 133061906631202af855d0742586956ff9f34522a525Chia-I Wu switch (readdraw) { 133161906631202af855d0742586956ff9f34522a525Chia-I Wu case EGL_DRAW: 133261906631202af855d0742586956ff9f34522a525Chia-I Wu surf = ctx->DrawSurface; 133361906631202af855d0742586956ff9f34522a525Chia-I Wu break; 133461906631202af855d0742586956ff9f34522a525Chia-I Wu case EGL_READ: 133561906631202af855d0742586956ff9f34522a525Chia-I Wu surf = ctx->ReadSurface; 133661906631202af855d0742586956ff9f34522a525Chia-I Wu break; 133761906631202af855d0742586956ff9f34522a525Chia-I Wu default: 133861906631202af855d0742586956ff9f34522a525Chia-I Wu surf = NULL; 1339b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu err = EGL_BAD_PARAMETER; 134061906631202af855d0742586956ff9f34522a525Chia-I Wu break; 134161906631202af855d0742586956ff9f34522a525Chia-I Wu } 134261906631202af855d0742586956ff9f34522a525Chia-I Wu 1343b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = _eglGetSurfaceHandle(surf); 1344b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1345bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, err, ret); 1346adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1347adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1348adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 13491ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY 1350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void) 1351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 135248822796339cb4a55714dc3f1abbe379562ec538Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 135348822796339cb4a55714dc3f1abbe379562ec538Brian Paul EGLint e = t->LastError; 135475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu if (!_eglIsCurrentThreadDummy()) 135575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu t->LastError = EGL_SUCCESS; 1356adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul return e; 1357adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1358adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1359adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1360b2006a40eb22899d38cd31691640555228e36975Brian Paul/** 1361b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2 1362b2006a40eb22899d38cd31691640555228e36975Brian Paul **/ 1363b2006a40eb22899d38cd31691640555228e36975Brian Paul 1364d5078b94323241a6482f54797756116b1c864327Brian Paul/** 1365d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including: 1366d5078b94323241a6482f54797756116b1c864327Brian Paul * eglCreateContext() 1367d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentContext() 1368d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentDisplay() 1369d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentSurface() 1370d5078b94323241a6482f54797756116b1c864327Brian Paul * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT) 1371d5078b94323241a6482f54797756116b1c864327Brian Paul * eglWaitClient() 1372d5078b94323241a6482f54797756116b1c864327Brian Paul * eglWaitNative() 1373d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details. 1374d5078b94323241a6482f54797756116b1c864327Brian Paul */ 1375c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY 1376b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api) 1377b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 13786a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGLThreadInfo *t; 1379b2006a40eb22899d38cd31691640555228e36975Brian Paul 13806a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE); 13816a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 13826a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman t = _eglGetCurrentThread(); 138375da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu if (_eglIsCurrentThreadDummy()) 1384bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE); 138575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu 138621b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu if (!_eglIsApiValid(api)) 1387bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE); 138821b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu 13896e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman t->CurrentAPI = api; 1390b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1391bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 1392b2006a40eb22899d38cd31691640555228e36975Brian Paul} 1393b2006a40eb22899d38cd31691640555228e36975Brian Paul 1394b2006a40eb22899d38cd31691640555228e36975Brian Paul 1395d5078b94323241a6482f54797756116b1c864327Brian Paul/** 1396d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI(). 1397d5078b94323241a6482f54797756116b1c864327Brian Paul */ 1398c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY 1399d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void) 1400d5078b94323241a6482f54797756116b1c864327Brian Paul{ 1401d5078b94323241a6482f54797756116b1c864327Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 1402b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLenum ret; 1403b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1404b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */ 14056e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman ret = t->CurrentAPI; 1406b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1407bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 1408d5078b94323241a6482f54797756116b1c864327Brian Paul} 1409d5078b94323241a6482f54797756116b1c864327Brian Paul 1410d5078b94323241a6482f54797756116b1c864327Brian Paul 1411c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY 1412b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, 1413b2006a40eb22899d38cd31691640555228e36975Brian Paul EGLClientBuffer buffer, EGLConfig config, 1414b2006a40eb22899d38cd31691640555228e36975Brian Paul const EGLint *attrib_list) 1415b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 1416655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 14172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 14182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 14192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 1420b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 14212f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 14226a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 14236a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1424bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 14252f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 14262f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer, 14272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu conf, attrib_list); 14284ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; 1429b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1430bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1431b2006a40eb22899d38cd31691640555228e36975Brian Paul} 1432b2006a40eb22899d38cd31691640555228e36975Brian Paul 1433b2006a40eb22899d38cd31691640555228e36975Brian Paul 1434c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY 1435b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void) 1436b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 143711cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu /* unbind current contexts */ 14382f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!_eglIsCurrentThreadDummy()) { 143911cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLThreadInfo *t = _eglGetCurrentThread(); 14406e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman _EGLContext *ctx = t->CurrentContext; 14416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 14426a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE); 14436a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 14446e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman if (ctx) { 14456e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman _EGLDisplay *disp = ctx->Resource.Display; 14466e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman _EGLDriver *drv; 14476e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman 14486e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman mtx_lock(&disp->Mutex); 14496e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman drv = disp->Driver; 14506e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL); 14516e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman mtx_unlock(&disp->Mutex); 14526e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman } 1453b2006a40eb22899d38cd31691640555228e36975Brian Paul } 14542f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 145575da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu _eglDestroyCurrentThread(); 1456b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1457bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 1458b2006a40eb22899d38cd31691640555228e36975Brian Paul} 14597012d01d888d482f2c6ad1180231a482026d213aJon Smirl 14607012d01d888d482f2c6ad1180231a482026d213aJon Smirl 146158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brennemanstatic EGLImage 146258338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman_eglCreateImageCommon(_EGLDisplay *disp, EGLContext ctx, EGLenum target, 1463a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu EGLClientBuffer buffer, const EGLint *attr_list) 1464a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{ 1465a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 1466a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDriver *drv; 1467a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLImage *img; 1468d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák EGLImage ret; 1469a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1470bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv); 14716b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!disp->Extensions.KHR_image_base) 14726b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR); 1473b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (!context && ctx != EGL_NO_CONTEXT) 1474bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 14750de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen /* "If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid display, 14760de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen * <ctx> must be EGL_NO_CONTEXT..." 14770de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen */ 14780de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen if (ctx != EGL_NO_CONTEXT && target == EGL_LINUX_DMA_BUF_EXT) 14790de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1480a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1481a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu img = drv->API.CreateImageKHR(drv, 1482a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu disp, context, target, buffer, attr_list); 14834ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR; 1484b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1485bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1486a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu} 1487a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 148858338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brennemanstatic EGLImage EGLAPIENTRY 148958338c6b650d85a2484f50c0941cb3e2947fab8eKyle BrennemaneglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 149058338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman EGLClientBuffer buffer, const EGLint *attr_list) 149158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman{ 149258338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 14936a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_IMAGE_KHR); 149458338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman return _eglCreateImageCommon(disp, ctx, target, buffer, attr_list); 149558338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman} 149658338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman 1497a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1498515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek OlšákEGLImage EGLAPIENTRY 1499515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek OlšákeglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, 1500515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák EGLClientBuffer buffer, const EGLAttrib *attr_list) 1501515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák{ 150258338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 1503515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák EGLImage image; 15046a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman EGLint *int_attribs; 15056a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 15066a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_IMAGE_KHR); 1507515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 15086a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman int_attribs = _eglConvertAttribsToInt(attr_list); 1509515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák if (attr_list && !int_attribs) 151058338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_IMAGE); 1511515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 151258338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman image = _eglCreateImageCommon(disp, ctx, target, buffer, int_attribs); 1513515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák free(int_attribs); 1514515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák return image; 1515515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák} 1516515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 1517515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 15182885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLBoolean EGLAPIENTRY 15192885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglDestroyImage(EGLDisplay dpy, EGLImage image) 1520a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{ 1521655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1522a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLImage *img = _eglLookupImage(image, disp); 1523a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDriver *drv; 1524b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1525a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 15266a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); 15276a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1528bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 15296b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!disp->Extensions.KHR_image_base) 15306b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_EVAL(disp, EGL_FALSE); 1531a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (!img) 1532bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1533a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1534a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _eglUnlinkImage(img); 1535b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroyImageKHR(drv, disp, img); 1536b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1537bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1538a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu} 1539a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1540a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1541d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLSync 1542804488518296fbf20b06244bc0aa2e2793c61998Chad Versace_eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_list, 1543804488518296fbf20b06244bc0aa2e2793c61998Chad Versace EGLBoolean orig_is_EGLAttrib, 154451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák EGLenum invalid_type_error) 15454eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 15469a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák _EGLContext *ctx = _eglGetCurrentContext(); 15474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 15484eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLSync *sync; 1549d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák EGLSync ret; 15504eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 15514eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv); 15529a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák 1553804488518296fbf20b06244bc0aa2e2793c61998Chad Versace if (!disp->Extensions.KHR_cl_event2 && orig_is_EGLAttrib) { 1554f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace /* There exist two EGLAttrib variants of eglCreateSync*: 1555f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * eglCreateSync64KHR which requires EGL_KHR_cl_event2, and eglCreateSync 1556f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * which requires EGL 1.5. Here we use the presence of EGL_KHR_cl_event2 1557f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * support as a proxy for EGL 1.5 support, even though that's not 1558f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * entirely correct (though _eglComputeVersion does the same). 1559f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * 1560f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * The EGL spec provides no guidance on how to handle unsupported 1561f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * functions. EGL_BAD_MATCH seems reasonable. 1562f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace */ 1563f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 1564f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace } 1565290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 15669a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák /* return an error if the client API doesn't support GL_OES_EGL_sync */ 15679a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman if (!ctx || ctx->Resource.Display != disp || 15689a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák ctx->ClientAPI != EGL_OPENGL_ES_API) 15699a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 15709a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák 15719a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák switch (type) { 15729a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák case EGL_SYNC_FENCE_KHR: 15739a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák if (!disp->Extensions.KHR_fence_sync) 157451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 15759a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák break; 15769a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák case EGL_SYNC_REUSABLE_KHR: 15779a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák if (!disp->Extensions.KHR_reusable_sync) 157851c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 15799a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák break; 1580290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák case EGL_SYNC_CL_EVENT_KHR: 1581290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák if (!disp->Extensions.KHR_cl_event2) 158251c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 1583290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák break; 15849a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák default: 158551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 15869a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák } 15874eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 1588804488518296fbf20b06244bc0aa2e2793c61998Chad Versace sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list); 15894ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR; 15904eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 15914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu RETURN_EGL_EVAL(disp, ret); 15924eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 15934eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 15944eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 1595d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLSync EGLAPIENTRY 1596804488518296fbf20b06244bc0aa2e2793c61998Chad VersaceeglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *int_list) 1597290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák{ 15989a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 15996a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 1600804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1601804488518296fbf20b06244bc0aa2e2793c61998Chad Versace EGLSync sync; 1602804488518296fbf20b06244bc0aa2e2793c61998Chad Versace EGLAttrib *attrib_list; 1603804488518296fbf20b06244bc0aa2e2793c61998Chad Versace EGLint err; 1604804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1605804488518296fbf20b06244bc0aa2e2793c61998Chad Versace if (sizeof(int_list[0]) == sizeof(attrib_list[0])) { 1606804488518296fbf20b06244bc0aa2e2793c61998Chad Versace attrib_list = (EGLAttrib *) int_list; 1607804488518296fbf20b06244bc0aa2e2793c61998Chad Versace } else { 1608804488518296fbf20b06244bc0aa2e2793c61998Chad Versace err = _eglConvertIntsToAttribs(int_list, &attrib_list); 1609804488518296fbf20b06244bc0aa2e2793c61998Chad Versace if (err != EGL_SUCCESS) 1610804488518296fbf20b06244bc0aa2e2793c61998Chad Versace RETURN_EGL_ERROR(disp, err, EGL_NO_SYNC); 1611804488518296fbf20b06244bc0aa2e2793c61998Chad Versace } 1612804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1613804488518296fbf20b06244bc0aa2e2793c61998Chad Versace sync = _eglCreateSync(disp, type, attrib_list, EGL_FALSE, 161451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák EGL_BAD_ATTRIBUTE); 1615804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1616804488518296fbf20b06244bc0aa2e2793c61998Chad Versace if (sizeof(int_list[0]) != sizeof(attrib_list[0])) 1617804488518296fbf20b06244bc0aa2e2793c61998Chad Versace free(attrib_list); 1618804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1619804488518296fbf20b06244bc0aa2e2793c61998Chad Versace /* Don't double-unlock the display. _eglCreateSync already unlocked it. */ 1620804488518296fbf20b06244bc0aa2e2793c61998Chad Versace return sync; 162151c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák} 162251c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák 162351c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák 162451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšákstatic EGLSync EGLAPIENTRY 162551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek OlšákeglCreateSync64KHR(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list) 162651c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák{ 16279a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 16286a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 1629804488518296fbf20b06244bc0aa2e2793c61998Chad Versace return _eglCreateSync(disp, type, attrib_list, EGL_TRUE, 163051c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák EGL_BAD_ATTRIBUTE); 1631290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák} 1632290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 1633290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 16342885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLSync EGLAPIENTRY 16352885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list) 1636290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák{ 16379a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 16386a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 1639804488518296fbf20b06244bc0aa2e2793c61998Chad Versace return _eglCreateSync(disp, type, attrib_list, EGL_TRUE, 164051c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák EGL_BAD_PARAMETER); 1641290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák} 1642290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 1643290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 16442885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLBoolean EGLAPIENTRY 16452885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglDestroySync(EGLDisplay dpy, EGLSync sync) 16464eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 16474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 16484eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLSync *s = _eglLookupSync(sync, disp); 16494eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 16504eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu EGLBoolean ret; 16514eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 16526a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 16536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 16544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 16559a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák assert(disp->Extensions.KHR_reusable_sync || 16569a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák disp->Extensions.KHR_fence_sync); 16576b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 16584eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _eglUnlinkSync(s); 16594eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu ret = drv->API.DestroySyncKHR(drv, disp, s); 16604eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 16614eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu RETURN_EGL_EVAL(disp, ret); 16624eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 16634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 16644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 16652885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLint EGLAPIENTRY 16662885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout) 16674eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 16684eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 16694eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLSync *s = _eglLookupSync(sync, disp); 16704eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 16714eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu EGLint ret; 16724eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 16736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 16746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 16754eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 16769a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák assert(disp->Extensions.KHR_reusable_sync || 16779a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák disp->Extensions.KHR_fence_sync); 16789a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák 16799a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák if (s->SyncStatus == EGL_SIGNALED_KHR) 16809a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák RETURN_EGL_EVAL(disp, EGL_CONDITION_SATISFIED_KHR); 16819a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák 168270299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim /* if sync type is EGL_SYNC_REUSABLE_KHR, dpy should be 168370299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim * unlocked here to allow other threads also to be able to 168470299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim * go into waiting state. 168570299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim */ 168670299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim 168770299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim if (s->Type == EGL_SYNC_REUSABLE_KHR) 168870299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim _eglUnlockDisplay(dpy); 168970299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim 16904eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout); 16914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 169270299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim /* 169370299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim * 'disp' is already unlocked for reusable sync type, 169470299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim * so passing 'NULL' to bypass unlocking display. 169570299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim */ 169670299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim if (s->Type == EGL_SYNC_REUSABLE_KHR) 169770299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim RETURN_EGL_EVAL(NULL, ret); 169870299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim else 169970299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim RETURN_EGL_EVAL(disp, ret); 17004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 17014eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17024eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17035b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brennemanstatic EGLint 17045b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman_eglWaitSyncCommon(_EGLDisplay *disp, _EGLSync *s, EGLint flags) 1705a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák{ 1706a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák _EGLContext *ctx = _eglGetCurrentContext(); 1707a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák _EGLDriver *drv; 1708a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák EGLint ret; 1709a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1710a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 1711a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák assert(disp->Extensions.KHR_wait_sync); 1712a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1713a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák /* return an error if the client API doesn't support GL_OES_EGL_sync */ 1714a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák if (ctx == EGL_NO_CONTEXT || ctx->ClientAPI != EGL_OPENGL_ES_API) 1715a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE); 1716a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1717a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák /* the API doesn't allow any flags yet */ 1718a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák if (flags != 0) 1719a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1720a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1721a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák ret = drv->API.WaitSyncKHR(drv, disp, s); 1722a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1723a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák RETURN_EGL_EVAL(disp, ret); 1724a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák} 1725a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 17265b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brennemanstatic EGLint EGLAPIENTRY 17275b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle BrennemaneglWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags) 17285b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman{ 17295b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 17305b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman _EGLSync *s = _eglLookupSync(sync, disp); 17316a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 17325b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman return _eglWaitSyncCommon(disp, s, flags); 17335b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman} 17345b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman 1735a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 17367524592da6305d52e95d718691d5a6665738aadeMarek OlšákEGLBoolean EGLAPIENTRY 17377524592da6305d52e95d718691d5a6665738aadeMarek OlšákeglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags) 17387524592da6305d52e95d718691d5a6665738aadeMarek Olšák{ 17397524592da6305d52e95d718691d5a6665738aadeMarek Olšák /* The KHR version returns EGLint, while the core version returns 17407524592da6305d52e95d718691d5a6665738aadeMarek Olšák * EGLBoolean. In both cases, the return values can only be EGL_FALSE and 17417524592da6305d52e95d718691d5a6665738aadeMarek Olšák * EGL_TRUE. 17427524592da6305d52e95d718691d5a6665738aadeMarek Olšák */ 17435b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 17445b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman _EGLSync *s = _eglLookupSync(sync, disp); 17456a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 17465b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman return _eglWaitSyncCommon(disp, s, flags); 17477524592da6305d52e95d718691d5a6665738aadeMarek Olšák} 17487524592da6305d52e95d718691d5a6665738aadeMarek Olšák 17497524592da6305d52e95d718691d5a6665738aadeMarek Olšák 1750e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 1751d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglSignalSyncKHR(EGLDisplay dpy, EGLSync sync, EGLenum mode) 17524eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 17534eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 17544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLSync *s = _eglLookupSync(sync, disp); 17554eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 17564eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu EGLBoolean ret; 17574eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 17596a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 17604eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 17616b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu assert(disp->Extensions.KHR_reusable_sync); 17624eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu ret = drv->API.SignalSyncKHR(drv, disp, s, mode); 17634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu RETURN_EGL_EVAL(disp, ret); 17654eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 17664eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17674eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17681d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brennemanstatic EGLBoolean 17691d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman_eglGetSyncAttribCommon(_EGLDisplay *disp, _EGLSync *s, EGLint attribute, EGLAttrib *value) 17704eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 17714eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 17724eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu EGLBoolean ret; 17734eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17744eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 17759a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák assert(disp->Extensions.KHR_reusable_sync || 17769a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák disp->Extensions.KHR_fence_sync); 17771e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák ret = drv->API.GetSyncAttrib(drv, disp, s, attribute, value); 17784eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17794eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu RETURN_EGL_EVAL(disp, ret); 17804eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 17814eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17821d535c1e83ae45b67a141420298c5d08082e0ed8Kyle BrennemanEGLBoolean EGLAPIENTRY 17831d535c1e83ae45b67a141420298c5d08082e0ed8Kyle BrennemaneglGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value) 17841d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman{ 17851d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 17861d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman _EGLSync *s = _eglLookupSync(sync, disp); 17876a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 17881d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman return _eglGetSyncAttribCommon(disp, s, attribute, value); 17891d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman} 17901d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman 17914eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17921e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšákstatic EGLBoolean EGLAPIENTRY 17931e79e054e7dff0c45538fff1257e1f81a206d7c9Marek OlšákeglGetSyncAttribKHR(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLint *value) 17941e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák{ 17951d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 17961d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman _EGLSync *s = _eglLookupSync(sync, disp); 1797d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim EGLAttrib attrib; 1798d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim EGLBoolean result; 1799d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim 18006a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 18016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1802d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim if (!value) 180317084b6f9340f798111e53e08f5d35c7630cee48Chad Versace RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1804d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim 1805d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim attrib = *value; 18061d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman result = _eglGetSyncAttribCommon(disp, s, attribute, &attrib); 18071e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák 18081e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák /* The EGL_KHR_fence_sync spec says this about eglGetSyncAttribKHR: 18091e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák * 18101e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák * If any error occurs, <*value> is not modified. 18111e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák */ 18121e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák if (result == EGL_FALSE) 18131e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák return result; 18141e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák 18151e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák *value = attrib; 18161e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák return result; 18171e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák} 18181e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák 18191e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák 1820e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 182152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface, 182252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg EGLint numRects, const EGLint *rects) 182352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{ 182452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLContext *ctx = _eglGetCurrentContext(); 182552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 182652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLSurface *surf = _eglLookupSurface(surface, disp); 182752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLDriver *drv; 182852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg EGLBoolean ret; 182952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 18306a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 18316a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 183252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 183352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 18346b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!disp->Extensions.NOK_swap_region) 18356b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_EVAL(disp, EGL_FALSE); 18366b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 183752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg /* surface must be bound to current context in EGL 1.4 */ 1838d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1839d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu surf != ctx->DrawSurface) 184052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 184152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 18426b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects); 184352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 184452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 184552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg} 184652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 1847b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1848d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLImage EGLAPIENTRY 1849b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list) 1850b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{ 1851b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 1852b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLDriver *drv; 1853b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLImage *img; 1854d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák EGLImage ret; 1855b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 18566a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 18576a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1858b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv); 18596b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!disp->Extensions.MESA_drm_image) 18606b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR); 1861b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1862b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg img = drv->API.CreateDRMImageMESA(drv, disp, attr_list); 18634ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR; 1864b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1865b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 1866b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg} 1867b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1868e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 1869d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDRMImageMESA(EGLDisplay dpy, EGLImage image, 1870b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLint *name, EGLint *handle, EGLint *stride) 1871b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{ 1872b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 1873b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLImage *img = _eglLookupImage(image, disp); 1874b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLDriver *drv; 1875b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLBoolean ret; 1876b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 18776a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); 18786a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1879b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 18806b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu assert(disp->Extensions.MESA_drm_image); 18816b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 1882b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg if (!img) 1883b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1884b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1885b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg ret = drv->API.ExportDRMImageMESA(drv, disp, img, name, handle, stride); 1886b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1887b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 1888b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg} 1889b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 18906b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 18916b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestruct wl_display; 18926b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 1893e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 18946b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) 18956b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{ 18966b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGLDisplay *disp = _eglLockDisplay(dpy); 18976b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGLDriver *drv; 18986b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke EGLBoolean ret; 18996b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19006a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 19016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 19026b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 19036b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke assert(disp->Extensions.WL_bind_wayland_display); 19046b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19056b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke if (!display) 19066b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 19076b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19086b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke ret = drv->API.BindWaylandDisplayWL(drv, disp, display); 19096b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19106b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke RETURN_EGL_EVAL(disp, ret); 19116b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke} 19126b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 1913e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 19146b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) 19156b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{ 19166b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGLDisplay *disp = _eglLockDisplay(dpy); 19176b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGLDriver *drv; 19186b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke EGLBoolean ret; 19196b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19206a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 19216a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 19226b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 19236b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke assert(disp->Extensions.WL_bind_wayland_display); 19246b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19256b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke if (!display) 19266b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 19276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke ret = drv->API.UnbindWaylandDisplayWL(drv, disp, display); 19296b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19306b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke RETURN_EGL_EVAL(disp, ret); 19316b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke} 1932e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 1933e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 19348d29b5271a2e66fc78436be31ed6748ff006f0cbAnder Conselvan de OliveiraeglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, 1935e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg EGLint attribute, EGLint *value) 1936e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg{ 1937e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 1938e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg _EGLDriver *drv; 1939e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg EGLBoolean ret; 1940e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 19416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 19426a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1943e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 1944e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg assert(disp->Extensions.WL_bind_wayland_display); 1945e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 1946e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg if (!buffer) 1947e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1948e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 1949e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg ret = drv->API.QueryWaylandBufferWL(drv, disp, buffer, attribute, value); 1950e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 1951e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 1952e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg} 19537d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 1954720125ff99a8563d1f5991bd7428b8d884f1f618Emil Velikov 1955e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic struct wl_buffer * EGLAPIENTRY 1956d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglCreateWaylandBufferFromImageWL(EGLDisplay dpy, EGLImage image) 19575cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts{ 19585cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts _EGLDisplay *disp = _eglLockDisplay(dpy); 19595cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts _EGLImage *img; 19605cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts _EGLDriver *drv; 19615cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts struct wl_buffer *ret; 19625cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 19636a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 19646a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 19655cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts _EGL_CHECK_DISPLAY(disp, NULL, drv); 19665cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts assert(disp->Extensions.WL_create_wayland_buffer_from_image); 19675cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 19685cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts img = _eglLookupImage(image, disp); 19695cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 19705cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts if (!img) 19715cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL); 19725cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 19735cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts ret = drv->API.CreateWaylandBufferFromImageWL(drv, disp, img); 19745cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 19755cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts RETURN_EGL_EVAL(disp, ret); 19765cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts} 19777d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 1978e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 19797d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik HöglundeglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface, 19807d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund EGLint x, EGLint y, EGLint width, EGLint height) 19817d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund{ 19827d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGLDisplay *disp = _eglLockDisplay(dpy); 19837d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGLSurface *surf = _eglLookupSurface(surface, disp); 19847d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGLDriver *drv; 19857d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund EGLBoolean ret; 19867d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 19876a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 19886a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 19897d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 19907d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 19917d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund if (!disp->Extensions.NV_post_sub_buffer) 19927d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund RETURN_EGL_EVAL(disp, EGL_FALSE); 19937d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 19947d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund ret = drv->API.PostSubBufferNV(drv, disp, surf, x, y, width, height); 19957d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 19967d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund RETURN_EGL_EVAL(disp, ret); 19977d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund} 1998c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 1999e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 2000c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah SharpeglGetSyncValuesCHROMIUM(EGLDisplay display, EGLSurface surface, 2001c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp EGLuint64KHR *ust, EGLuint64KHR *msc, 2002c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp EGLuint64KHR *sbc) 2003c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp{ 2004c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp _EGLDisplay *disp = _eglLockDisplay(display); 2005c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp _EGLSurface *surf = _eglLookupSurface(surface, disp); 2006c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp _EGLDriver *drv; 2007c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp EGLBoolean ret; 2008c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 20096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 20106a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2011c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 2012c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp if (!disp->Extensions.CHROMIUM_sync_control) 2013c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp RETURN_EGL_EVAL(disp, EGL_FALSE); 2014c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 2015c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp if (!ust || !msc || !sbc) 2016c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 2017c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 2018c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp ret = drv->API.GetSyncValuesCHROMIUM(disp, surf, ust, msc, sbc); 2019c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 2020c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp RETURN_EGL_EVAL(disp, ret); 2021c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp} 20228f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 2023e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 2024d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDMABUFImageQueryMESA(EGLDisplay dpy, EGLImage image, 20258f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie EGLint *fourcc, EGLint *nplanes, 2026b5045e29917a783be74becee5e72566e2b0e3535Dave Airlie EGLuint64KHR *modifiers) 20278f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie{ 20288f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLDisplay *disp = _eglLockDisplay(dpy); 20298f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLImage *img = _eglLookupImage(image, disp); 20308f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLDriver *drv; 20318f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie EGLBoolean ret; 20328f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 20336a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); 20346a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 20358f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 20368f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie assert(disp->Extensions.MESA_image_dma_buf_export); 20378f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 20388f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie if (!img) 20398f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 20408f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 20418f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie ret = drv->API.ExportDMABUFImageQueryMESA(drv, disp, img, fourcc, nplanes, 20428f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie modifiers); 20438f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 20448f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie RETURN_EGL_EVAL(disp, ret); 20458f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie} 20468f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 2047e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 2048d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDMABUFImageMESA(EGLDisplay dpy, EGLImage image, 20498f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie int *fds, EGLint *strides, EGLint *offsets) 20508f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie{ 20518f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLDisplay *disp = _eglLockDisplay(dpy); 20528f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLImage *img = _eglLookupImage(image, disp); 20538f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLDriver *drv; 20548f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie EGLBoolean ret; 20558f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 20566a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); 20576a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 20588f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 20598f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie assert(disp->Extensions.MESA_image_dma_buf_export); 20608f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 20618f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie if (!img) 20628f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 20638f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 20648f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie ret = drv->API.ExportDMABUFImageMESA(drv, disp, img, fds, strides, offsets); 20658f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 20668f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie RETURN_EGL_EVAL(disp, ret); 20678f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie} 2068e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov 2069ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLint EGLAPIENTRY 2070ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglLabelObjectKHR(EGLDisplay dpy, EGLenum objectType, EGLObjectKHR object, 2071ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman EGLLabelKHR label) 2072ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{ 2073ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGLDisplay *disp = NULL; 2074ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGLResourceType type; 2075ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2076ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC); 2077ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2078ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (objectType == EGL_OBJECT_THREAD_KHR) { 2079ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGLThreadInfo *t = _eglGetCurrentThread(); 2080ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2081ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (!_eglIsCurrentThreadDummy()) { 2082ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman t->Label = label; 2083ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_SUCCESS; 2084ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2085ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2086ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_BAD_ALLOC); 2087ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2088ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2089ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman disp = _eglLockDisplay(dpy); 2090ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (disp == NULL) 2091ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_BAD_DISPLAY); 2092ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2093ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (objectType == EGL_OBJECT_DISPLAY_KHR) { 2094ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (dpy != (EGLDisplay) object) 2095ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER); 2096ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2097ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman disp->Label = label; 2098ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_EVAL(disp, EGL_SUCCESS); 2099ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2100ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2101ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman switch (objectType) { 2102ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_CONTEXT_KHR: 2103ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman type = _EGL_RESOURCE_CONTEXT; 2104ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2105ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_SURFACE_KHR: 2106ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman type = _EGL_RESOURCE_SURFACE; 2107ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2108ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_IMAGE_KHR: 2109ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman type = _EGL_RESOURCE_IMAGE; 2110ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2111ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_SYNC_KHR: 2112ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman type = _EGL_RESOURCE_SYNC; 2113ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2114ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_STREAM_KHR: 2115ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman default: 2116ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER); 2117ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2118ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2119ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (_eglCheckResource(object, type, disp)) { 2120ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGLResource *res = (_EGLResource *) object; 2121ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2122ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman res->Label = label; 2123ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_EVAL(disp, EGL_SUCCESS); 2124ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2125ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2126ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER); 2127ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman} 2128ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2129ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLBoolean 2130ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemanvalidDebugMessageLevel(EGLAttrib level) 2131ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{ 2132ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return (level >= EGL_DEBUG_MSG_CRITICAL_KHR && 2133ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman level <= EGL_DEBUG_MSG_INFO_KHR); 2134ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman} 2135ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2136ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLint EGLAPIENTRY 2137ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglDebugMessageControlKHR(EGLDEBUGPROCKHR callback, 2138ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman const EGLAttrib *attrib_list) 2139ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{ 2140ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman unsigned int newEnabled; 2141ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2142ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC); 2143ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2144ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_lock(_eglGlobal.Mutex); 2145ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2146ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman newEnabled = _eglGlobal.debugTypesEnabled; 2147ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (attrib_list != NULL) { 2148ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman int i; 2149ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2150ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman for (i = 0; attrib_list[i] != EGL_NONE; i += 2) { 2151ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (validDebugMessageLevel(attrib_list[i])) { 2152ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (attrib_list[i + 1]) 2153ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman newEnabled |= DebugBitFromType(attrib_list[i]); 2154ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman else 2155ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman newEnabled &= ~DebugBitFromType(attrib_list[i]); 2156ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman continue; 2157ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2158ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2159ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman // On error, set the last error code, call the current 2160ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman // debug callback, and return the error code. 2161ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_unlock(_eglGlobal.Mutex); 2162ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglReportError(EGL_BAD_ATTRIBUTE, NULL, 2163ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman "Invalid attribute 0x%04lx", (unsigned long) attrib_list[i]); 2164ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_BAD_ATTRIBUTE; 2165ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2166ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2167ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2168ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (callback != NULL) { 2169ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglGlobal.debugCallback = callback; 2170ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglGlobal.debugTypesEnabled = newEnabled; 2171ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } else { 2172ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglGlobal.debugCallback = NULL; 2173ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglGlobal.debugTypesEnabled = _EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR; 2174ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2175ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2176ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_unlock(_eglGlobal.Mutex); 2177ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_SUCCESS; 2178ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman} 2179ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2180ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLBoolean EGLAPIENTRY 2181ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglQueryDebugKHR(EGLint attribute, EGLAttrib *value) 2182ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{ 2183ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC); 2184ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2185ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_lock(_eglGlobal.Mutex); 2186ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2187ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman do { 2188ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (validDebugMessageLevel(attribute)) { 2189ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (_eglGlobal.debugTypesEnabled & DebugBitFromType(attribute)) 2190ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman *value = EGL_TRUE; 2191ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman else 2192ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman *value = EGL_FALSE; 2193ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2194ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2195ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2196ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (attribute == EGL_DEBUG_CALLBACK_KHR) { 2197ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman *value = (EGLAttrib) _eglGlobal.debugCallback; 2198ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2199ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2200ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2201ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_unlock(_eglGlobal.Mutex); 2202ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglReportError(EGL_BAD_ATTRIBUTE, NULL, 2203ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman "Invalid attribute 0x%04lx", (unsigned long) attribute); 2204ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_FALSE; 2205ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } while (0); 2206ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2207ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_unlock(_eglGlobal.Mutex); 2208ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_TRUE; 2209ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman} 2210ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2211e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov__eglMustCastToProperFunctionPointerType EGLAPIENTRY 2212e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil VelikoveglGetProcAddress(const char *procname) 2213e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov{ 2214e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov static const struct { 2215e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov const char *name; 2216e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov _EGLProc function; 2217e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov } egl_functions[] = { 2218448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov /* core functions queryable in the presence of 2219448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov * EGL_KHR_get_all_proc_addresses or EGL 1.5 2220448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov */ 2221e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov /* alphabetical order */ 2222e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglBindAPI", (_EGLProc) eglBindAPI }, 2223e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglBindTexImage", (_EGLProc) eglBindTexImage }, 2224e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglChooseConfig", (_EGLProc) eglChooseConfig }, 2225e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCopyBuffers", (_EGLProc) eglCopyBuffers }, 2226e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateContext", (_EGLProc) eglCreateContext }, 2227e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePbufferFromClientBuffer", (_EGLProc) eglCreatePbufferFromClientBuffer }, 2228e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface }, 2229e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface }, 2230e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface }, 2231e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglDestroyContext", (_EGLProc) eglDestroyContext }, 2232e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglDestroySurface", (_EGLProc) eglDestroySurface }, 2233e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib }, 2234e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetConfigs", (_EGLProc) eglGetConfigs }, 2235e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext }, 2236e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay }, 2237e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface }, 2238e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetDisplay", (_EGLProc) eglGetDisplay }, 2239e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetError", (_EGLProc) eglGetError }, 2240e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetProcAddress", (_EGLProc) eglGetProcAddress }, 2241e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglInitialize", (_EGLProc) eglInitialize }, 2242e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglMakeCurrent", (_EGLProc) eglMakeCurrent }, 2243e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQueryAPI", (_EGLProc) eglQueryAPI }, 2244e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQueryContext", (_EGLProc) eglQueryContext }, 2245e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQueryString", (_EGLProc) eglQueryString }, 2246e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQuerySurface", (_EGLProc) eglQuerySurface }, 2247e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage }, 2248e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglReleaseThread", (_EGLProc) eglReleaseThread }, 2249e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSurfaceAttrib", (_EGLProc) eglSurfaceAttrib }, 2250e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSwapBuffers", (_EGLProc) eglSwapBuffers }, 2251e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSwapInterval", (_EGLProc) eglSwapInterval }, 2252e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglTerminate", (_EGLProc) eglTerminate }, 2253e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglWaitClient", (_EGLProc) eglWaitClient }, 2254e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglWaitGL", (_EGLProc) eglWaitGL }, 2255e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglWaitNative", (_EGLProc) eglWaitNative }, 22562885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglCreateSync", (_EGLProc) eglCreateSync }, 22572885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglDestroySync", (_EGLProc) eglDestroySync }, 22582885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglClientWaitSync", (_EGLProc) eglClientWaitSync }, 22591e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák { "eglGetSyncAttrib", (_EGLProc) eglGetSyncAttrib }, 22607524592da6305d52e95d718691d5a6665738aadeMarek Olšák { "eglWaitSync", (_EGLProc) eglWaitSync }, 2261515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák { "eglCreateImage", (_EGLProc) eglCreateImage }, 22622885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglDestroyImage", (_EGLProc) eglDestroyImage }, 2263820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák { "eglGetPlatformDisplay", (_EGLProc) eglGetPlatformDisplay }, 2264820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák { "eglCreatePlatformWindowSurface", (_EGLProc) eglCreatePlatformWindowSurface }, 2265820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák { "eglCreatePlatformPixmapSurface", (_EGLProc) eglCreatePlatformPixmapSurface }, 2266e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR }, 22672885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglDestroyImageKHR", (_EGLProc) eglDestroyImage }, 2268e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateSyncKHR", (_EGLProc) eglCreateSyncKHR }, 226951c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák { "eglCreateSync64KHR", (_EGLProc) eglCreateSync64KHR }, 22702885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglDestroySyncKHR", (_EGLProc) eglDestroySync }, 22712885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglClientWaitSyncKHR", (_EGLProc) eglClientWaitSync }, 2272e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglWaitSyncKHR", (_EGLProc) eglWaitSyncKHR }, 2273e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSignalSyncKHR", (_EGLProc) eglSignalSyncKHR }, 2274e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetSyncAttribKHR", (_EGLProc) eglGetSyncAttribKHR }, 2275e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK }, 2276e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateDRMImageMESA", (_EGLProc) eglCreateDRMImageMESA }, 2277e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglExportDRMImageMESA", (_EGLProc) eglExportDRMImageMESA }, 2278e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglBindWaylandDisplayWL", (_EGLProc) eglBindWaylandDisplayWL }, 2279e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglUnbindWaylandDisplayWL", (_EGLProc) eglUnbindWaylandDisplayWL }, 2280e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQueryWaylandBufferWL", (_EGLProc) eglQueryWaylandBufferWL }, 2281e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateWaylandBufferFromImageWL", (_EGLProc) eglCreateWaylandBufferFromImageWL }, 2282e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglPostSubBufferNV", (_EGLProc) eglPostSubBufferNV }, 2283e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSwapBuffersWithDamageEXT", (_EGLProc) eglSwapBuffersWithDamageEXT }, 22840a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom { "eglSwapBuffersWithDamageKHR", (_EGLProc) eglSwapBuffersWithDamageKHR }, 2285e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetPlatformDisplayEXT", (_EGLProc) eglGetPlatformDisplayEXT }, 2286e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePlatformWindowSurfaceEXT", (_EGLProc) eglCreatePlatformWindowSurfaceEXT }, 2287e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePlatformPixmapSurfaceEXT", (_EGLProc) eglCreatePlatformPixmapSurfaceEXT }, 2288e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetSyncValuesCHROMIUM", (_EGLProc) eglGetSyncValuesCHROMIUM }, 2289e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglExportDMABUFImageQueryMESA", (_EGLProc) eglExportDMABUFImageQueryMESA }, 2290e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglExportDMABUFImageMESA", (_EGLProc) eglExportDMABUFImageMESA }, 2291ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman { "eglLabelObjectKHR", (_EGLProc) eglLabelObjectKHR }, 2292ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman { "eglDebugMessageControlKHR", (_EGLProc) eglDebugMessageControlKHR }, 2293ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman { "eglQueryDebugKHR", (_EGLProc) eglQueryDebugKHR }, 2294e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { NULL, NULL } 2295e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov }; 2296e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov EGLint i; 2297e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov _EGLProc ret; 2298e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov 2299e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov if (!procname) 2300e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov RETURN_EGL_SUCCESS(NULL, NULL); 2301e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov 23026a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, NULL); 23036a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2304e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov ret = NULL; 2305e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov if (strncmp(procname, "egl", 3) == 0) { 2306e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov for (i = 0; egl_functions[i].name; i++) { 2307e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov if (strcmp(egl_functions[i].name, procname) == 0) { 2308e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov ret = egl_functions[i].function; 2309e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov break; 2310e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov } 2311e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov } 2312e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov } 2313e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov if (!ret) 2314e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov ret = _eglGetDriverProc(procname); 2315e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov 2316e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov RETURN_EGL_SUCCESS(NULL, ret); 2317e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov} 2318b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2319b6eda708431b91a3b568da0efac845c08cb36796Marek Olšákstatic int 2320b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák_eglLockDisplayInterop(EGLDisplay dpy, EGLContext context, 2321b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDisplay **disp, _EGLDriver **drv, 2322b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLContext **ctx) 2323b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{ 2324b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2325b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák *disp = _eglLockDisplay(dpy); 2326b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (!*disp || !(*disp)->Initialized || !(*disp)->Driver) { 2327b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (*disp) 2328b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _eglUnlockDisplay(*disp); 2329b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return MESA_GLINTEROP_INVALID_DISPLAY; 2330b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák } 2331b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2332b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák *drv = (*disp)->Driver; 2333b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2334b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák *ctx = _eglLookupContext(context, *disp); 2335b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (!*ctx || 2336b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ((*ctx)->ClientAPI != EGL_OPENGL_API && 2337b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák (*ctx)->ClientAPI != EGL_OPENGL_ES_API)) { 2338b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _eglUnlockDisplay(*disp); 2339b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return MESA_GLINTEROP_INVALID_CONTEXT; 2340b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák } 2341b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2342b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return MESA_GLINTEROP_SUCCESS; 2343b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák} 2344b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2345b5f9820d905a275bc01bbffa9b4927ec11286f8dEmil Velikovint 2346b6eda708431b91a3b568da0efac845c08cb36796Marek OlšákMesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context, 234713faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov struct mesa_glinterop_device_info *out) 2348b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{ 2349b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDisplay *disp; 2350b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDriver *drv; 2351b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLContext *ctx; 2352b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák int ret; 2353b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2354b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx); 2355b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (ret != MESA_GLINTEROP_SUCCESS) 2356b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return ret; 2357b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2358b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (drv->API.GLInteropQueryDeviceInfo) 2359b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = drv->API.GLInteropQueryDeviceInfo(disp, ctx, out); 2360b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák else 2361b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = MESA_GLINTEROP_UNSUPPORTED; 2362b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2363b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _eglUnlockDisplay(disp); 2364b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return ret; 2365b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák} 2366b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2367b5f9820d905a275bc01bbffa9b4927ec11286f8dEmil Velikovint 2368b6eda708431b91a3b568da0efac845c08cb36796Marek OlšákMesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context, 236913faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov struct mesa_glinterop_export_in *in, 237013faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov struct mesa_glinterop_export_out *out) 2371b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{ 2372b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDisplay *disp; 2373b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDriver *drv; 2374b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLContext *ctx; 2375b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák int ret; 2376b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2377b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx); 2378b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (ret != MESA_GLINTEROP_SUCCESS) 2379b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return ret; 2380b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2381b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (drv->API.GLInteropExportObject) 2382b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = drv->API.GLInteropExportObject(disp, ctx, in, out); 2383b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák else 2384b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = MESA_GLINTEROP_UNSUPPORTED; 2385b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2386b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _eglUnlockDisplay(disp); 2387b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return ret; 2388b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák} 2389