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 */ 2919e1d35ca75852d5b6ad24a7df278b2c3efc31a46Eric Engestromstatic EGLint 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 396a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#ifdef HAVE_SURFACELESS_PLATFORM 397a597c8ad5b75f37336257e3f4462caebacb621efChad Versace case EGL_PLATFORM_SURFACELESS_MESA: 398a597c8ad5b75f37336257e3f4462caebacb621efChad Versace dpy = _eglGetSurfacelessDisplay(native_display, attrib_list); 399a597c8ad5b75f37336257e3f4462caebacb621efChad Versace break; 400a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#endif 401468cc866b4b308cee40470f06b31002c6c56da96Chad Versace default: 402468cc866b4b308cee40470f06b31002c6c56da96Chad Versace RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL); 403468cc866b4b308cee40470f06b31002c6c56da96Chad Versace } 404468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 405468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglGetDisplayHandle(dpy); 406468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 407adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 408017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brennemanstatic EGLDisplay EGLAPIENTRY 409017946b7247ea7c36219b44dfc118ccad4da7d1dKyle BrennemaneglGetPlatformDisplayEXT(EGLenum platform, void *native_display, 410017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman const EGLint *attrib_list) 411017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman{ 4126a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY); 413017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman return _eglGetPlatformDisplayCommon(platform, native_display, attrib_list); 414017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman} 415017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman 416820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLDisplay EGLAPIENTRY 417820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglGetPlatformDisplay(EGLenum platform, void *native_display, 418820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák const EGLAttrib *attrib_list) 419820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{ 420820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák EGLDisplay display; 421017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman EGLint *int_attribs; 422820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 4236a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_NO_DISPLAY); 4246a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 425017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman int_attribs = _eglConvertAttribsToInt(attrib_list); 426820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák if (attrib_list && !int_attribs) 427820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, NULL); 428820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 429017946b7247ea7c36219b44dfc118ccad4da7d1dKyle Brenneman display = _eglGetPlatformDisplayCommon(platform, native_display, int_attribs); 430820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák free(int_attribs); 431820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák return display; 432820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák} 433820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 4346052af172f0241e6678cd16efac0a0f14f40146cBrian Paul/** 435dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * Copy the extension into the string and update the string pointer. 436dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner */ 437dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic EGLint 438dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglAppendExtension(char **str, const char *ext) 439dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{ 440dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner char *s = *str; 441dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner size_t len = strlen(ext); 442dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 443dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner if (s) { 444dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner memcpy(s, ext, len); 445dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner s[len++] = ' '; 446dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner s[len] = '\0'; 447dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 448dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner *str += len; 449dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner } 450dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner else { 451dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner len++; 452dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner } 453dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 454dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner return (EGLint) len; 455dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner} 456dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 457dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner/** 458dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * Examine the individual extension enable/disable flags and recompute 459dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner * the driver's Extensions string. 460dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner */ 461dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic void 462dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglCreateExtensionsString(_EGLDisplay *dpy) 463dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{ 464dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner#define _EGL_CHECK_EXTENSION(ext) \ 465dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner do { \ 466dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner if (dpy->Extensions.ext) { \ 467dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _eglAppendExtension(&exts, "EGL_" #ext); \ 468dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner assert(exts <= dpy->ExtensionsString + _EGL_MAX_EXTENSIONS_LEN); \ 469dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner } \ 470dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner } while (0) 471dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 472dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner char *exts = dpy->ExtensionsString; 473dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 47432aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák /* Please keep these sorted alphabetically. */ 4758975527f58afd4af77966c6e46b485fc04008779Rob Herring _EGL_CHECK_EXTENSION(ANDROID_framebuffer_target); 47632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(ANDROID_image_native_buffer); 4770201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark _EGL_CHECK_EXTENSION(ANDROID_native_fence_sync); 478e21e81aa1885287e438970429d44abb8b3dabb96Rob Herring _EGL_CHECK_EXTENSION(ANDROID_recordable); 479dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 48032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(CHROMIUM_sync_control); 481dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 48232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(EXT_buffer_age); 48332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(EXT_create_context_robustness); 48432aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(EXT_image_dma_buf_import); 48532aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(EXT_swap_buffers_with_damage); 486dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 48732aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_cl_event2); 48826541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov _EGL_CHECK_EXTENSION(KHR_config_attribs); 48932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_create_context); 49032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_fence_sync); 491dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(KHR_get_all_proc_addresses); 49232aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_gl_colorspace); 49332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_gl_renderbuffer_image); 494dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(KHR_gl_texture_2D_image); 495dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(KHR_gl_texture_3D_image); 49632aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_gl_texture_cubemap_image); 49732aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák if (dpy->Extensions.KHR_image_base && dpy->Extensions.KHR_image_pixmap) 49832aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _eglAppendExtension(&exts, "EGL_KHR_image"); 49932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_image_base); 50032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_image_pixmap); 501d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson _EGL_CHECK_EXTENSION(KHR_no_config_context); 502dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(KHR_reusable_sync); 50332aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(KHR_surfaceless_context); 5040a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom if (dpy->Extensions.EXT_swap_buffers_with_damage) 5050a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _eglAppendExtension(&exts, "EGL_KHR_swap_buffers_with_damage"); 506a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák _EGL_CHECK_EXTENSION(KHR_wait_sync); 507dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 508d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson if (dpy->Extensions.KHR_no_config_context) 509d9f5b1915b397d4baaf4c9c23a93fda49f3db4caAdam Jackson _eglAppendExtension(&exts, "EGL_MESA_configless_context"); 51032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(MESA_drm_image); 51132aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(MESA_image_dma_buf_export); 512dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 513dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(NOK_swap_region); 514dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(NOK_texture_from_pixmap); 515dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 516dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _EGL_CHECK_EXTENSION(NV_post_sub_buffer); 5178f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 51832aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(WL_bind_wayland_display); 51932aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák _EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image); 52032aa1d769de070c4e8756922571c35deaf12a40aMarek Olšák 521dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner#undef _EGL_CHECK_EXTENSION 522dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner} 523dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 524dac2e7deaae2540645a6b485c7d1f47195689116Matt Turnerstatic void 525dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner_eglCreateAPIsString(_EGLDisplay *dpy) 526dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner{ 527dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner if (dpy->ClientAPIs & EGL_OPENGL_BIT) 528dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner strcat(dpy->ClientAPIsString, "OpenGL "); 529dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 53021edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova if (dpy->ClientAPIs & EGL_OPENGL_ES_BIT || 53121edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova dpy->ClientAPIs & EGL_OPENGL_ES2_BIT || 53221edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova dpy->ClientAPIs & EGL_OPENGL_ES3_BIT_KHR) { 533dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner strcat(dpy->ClientAPIsString, "OpenGL_ES "); 53421edd24c0de903a12a92e969b78d3a928b9ed50cPlamena Manolova } 535dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 536dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner if (dpy->ClientAPIs & EGL_OPENVG_BIT) 537dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner strcat(dpy->ClientAPIsString, "OpenVG "); 538dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 539dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner assert(strlen(dpy->ClientAPIsString) < sizeof(dpy->ClientAPIsString)); 540dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner} 541dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 542efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšákstatic void 543efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák_eglComputeVersion(_EGLDisplay *disp) 544efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák{ 5450e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák disp->Version = 14; 546a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák 547a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák if (disp->Extensions.KHR_fence_sync && 548a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_cl_event2 && 549a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_wait_sync && 550a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_image_base && 551a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_texture_2D_image && 552a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_texture_3D_image && 553a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_texture_cubemap_image && 554a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_renderbuffer_image && 555a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_create_context && 556a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.EXT_create_context_robustness && 557a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_get_all_proc_addresses && 558a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_gl_colorspace && 559a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Extensions.KHR_surfaceless_context) 560a1cb407b049bb431b0f6f21e6e376d11f136af67Marek Olšák disp->Version = 15; 561efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák} 562dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 563dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner/** 5646052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * This is typically the second EGL function that an application calls. 5656052af172f0241e6678cd16efac0a0f14f40146cBrian Paul * Here we load/initialize the actual hardware driver. 5666052af172f0241e6678cd16efac0a0f14f40146cBrian Paul */ 5671ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 568adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor) 569adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 570655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 5717e2458c7b55b2662067d8cce8a962d8c2bbd3a43Jonathan White 5726a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 5736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 5742f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!disp) 575bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE); 5762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 577a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (!disp->Initialized) { 578f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu if (!_eglMatchDriver(disp, EGL_FALSE)) 579f2aa361f3b58a91780c9358b3f8716f6434074c7Chia-I Wu RETURN_EGL_ERROR(disp, EGL_NOT_INITIALIZED, EGL_FALSE); 5802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 581310c76812e5a2013dad36fc9d1686f57e7b1e626Chia-I Wu /* limit to APIs supported by core */ 582a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu disp->ClientAPIs &= _EGL_API_ALL_BITS; 5837e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace 5847e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace /* EGL_KHR_get_all_proc_addresses is a corner-case extension. The spec 5857e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * classifies it as an EGL display extension, though conceptually it's an 5867e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL client extension. 5877e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * 5887e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * From the EGL_KHR_get_all_proc_addresses spec: 5897e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * 5907e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * The EGL implementation must expose the name 5917e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL_KHR_client_get_all_proc_addresses if and only if it exposes 5927e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL_KHR_get_all_proc_addresses and supports 5937e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL_EXT_client_extensions. 5947e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * 5957e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * Mesa unconditionally exposes both client extensions mentioned above, 5967e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * so the spec requires that each EGLDisplay unconditionally expose 5977e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace * EGL_KHR_get_all_proc_addresses also. 5987e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace */ 5997e8ba77c49b3fc0fe56d0ba60acc734d389fd9bdChad Versace disp->Extensions.KHR_get_all_proc_addresses = EGL_TRUE; 600dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner 60126541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov /* Extensions is used to provide EGL 1.3 functionality for 1.2 aware 60226541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov * programs. It is driver agnostic and handled in the main EGL code. 60326541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov */ 60426541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov disp->Extensions.KHR_config_attribs = EGL_TRUE; 60526541a1fcc1fbb1e4aa25e79225bbe43d50d600dEmil Velikov 606efda9c56491f5cb90e77f5fe7979477fc9b2b529Marek Olšák _eglComputeVersion(disp); 607dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _eglCreateExtensionsString(disp); 608dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner _eglCreateAPIsString(disp); 6093593f37fd7b599e217bd1f894ac671a14a058b8dEmil Velikov snprintf(disp->VersionString, sizeof(disp->VersionString), 6100e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák "%d.%d (%s)", disp->Version / 10, disp->Version % 10, 611dac2e7deaae2540645a6b485c7d1f47195689116Matt Turner disp->Driver->Name); 612adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul } 6132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6142f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu /* Update applications version of major and minor if not NULL */ 6152f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if ((major != NULL) && (minor != NULL)) { 6160e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák *major = disp->Version / 10; 6170e4b564ef288159f16f7a6886b6cfc0110411af8Marek Olšák *minor = disp->Version % 10; 6182f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 6192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 620bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 621adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 622adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 623adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6241ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 625adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglTerminate(EGLDisplay dpy) 626adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 627655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 6282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6296a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 6306a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 6312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!disp) 632bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_DISPLAY, EGL_FALSE); 6332f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 634a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu if (disp->Initialized) { 635a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu _EGLDriver *drv = disp->Driver; 636a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu 637ccc2b0bc65b02d4582d52d133290c8cb046bce8fChia-I Wu drv->API.Terminate(drv, disp); 638a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu /* do not reset disp->Driver */ 63937e3a116f8ae09d0fa894d126d081a1af24ec14fDave Airlie disp->ClientAPIsString[0] = 0; 640a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu disp->Initialized = EGL_FALSE; 6412f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu } 6422f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 643bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 6442f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu} 6452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6462f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 6471ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian Paulconst char * EGLAPIENTRY 648adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglQueryString(EGLDisplay dpy, EGLint name) 649adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 6503c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace _EGLDisplay *disp; 651aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 652aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 6533c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) { 6543c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace RETURN_EGL_SUCCESS(NULL, _eglGlobal.ClientExtensionString); 6553c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace } 6563c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace 6573c58d4c700bc1d0a0d56c26645e900201b7f249eChad Versace disp = _eglLockDisplay(dpy); 6586a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, NULL); 659bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, NULL, drv); 660b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 6616c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner switch (name) { 6626c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner case EGL_VENDOR: 6636c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_SUCCESS(disp, _EGL_VENDOR_STRING); 6646c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner case EGL_VERSION: 6656c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_SUCCESS(disp, disp->VersionString); 6666c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner case EGL_EXTENSIONS: 6676c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_SUCCESS(disp, disp->ExtensionsString); 6686c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner case EGL_CLIENT_APIS: 6696c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_SUCCESS(disp, disp->ClientAPIsString); 6706c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner default: 6716c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL); 6726c6e2a15aa7e8c0fd9a1180a901389c1692992c3Matt Turner } 673adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 674adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 675adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigs(EGLDisplay dpy, EGLConfig *configs, 6782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint config_size, EGLint *num_config) 679adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 680655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 681aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 682b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 683aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 6846a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 6856a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 686bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 687b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetConfigs(drv, disp, configs, config_size, num_config); 688b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 689bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 690adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 691adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 692adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 6931ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 6942f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, 6952f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint config_size, EGLint *num_config) 696adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 697655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 698aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 699b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 700aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 7016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 7026a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 703bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 704b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ChooseConfig(drv, disp, attrib_list, configs, 7052f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu config_size, num_config); 706b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 707bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 708adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 709adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 710adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7111ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 7122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, 7132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 714adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 715655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 7162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 7172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 718b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 7192f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7206a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 7216a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 722bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_FALSE, drv); 723b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.GetConfigAttrib(drv, disp, conf, attribute, value); 724b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 725bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 726adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 727adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 728adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7291ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY 7302f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_list, 7312f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 7322f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu{ 733655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 7342f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 7352f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *share = _eglLookupContext(share_list, disp); 7362f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 7372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context; 738b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLContext ret; 7392f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7406a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_CONTEXT); 7416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 7426b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_NO_CONTEXT, drv); 7436b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 7445876f3c85a61d73bb4863331bd641152a40a7b0cTapani Pälli if (config != EGL_NO_CONFIG_KHR) 7455876f3c85a61d73bb4863331bd641152a40a7b0cTapani Pälli _EGL_CHECK_CONFIG(disp, conf, EGL_NO_CONTEXT, drv); 7465876f3c85a61d73bb4863331bd641152a40a7b0cTapani Pälli else if (!disp->Extensions.KHR_no_config_context) 7474b17dff3e5128bef67ea79d20624e878c3b48729Neil Roberts RETURN_EGL_ERROR(disp, EGL_BAD_CONFIG, EGL_NO_CONTEXT); 748b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg 749b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (!share && share_list != EGL_NO_CONTEXT) 750bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_CONTEXT); 7512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7522f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu context = drv->API.CreateContext(drv, disp, conf, share, attrib_list); 7534ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (context) ? _eglLinkContext(context) : EGL_NO_CONTEXT; 754b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 755bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 756adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 757adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 758adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7591ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 760adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroyContext(EGLDisplay dpy, EGLContext ctx) 761adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 762655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 763aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 764aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 765b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 766aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 7676a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE); 7686a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 769bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv); 7702f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglUnlinkContext(context); 771b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroyContext(drv, disp, context); 772b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 773bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 774adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 775adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 776adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 7771ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 7782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, 7792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLContext ctx) 780adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 781655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 7822f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 7832f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *draw_surf = _eglLookupSurface(draw, disp); 7842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *read_surf = _eglLookupSurface(read, disp); 7852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 786b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 7872f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 7886a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE); 7896a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 79017330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (!disp) 791bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE); 79217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu drv = disp->Driver; 79317330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu 79417330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu /* display is allowed to be uninitialized under certain condition */ 79517330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (!disp->Initialized) { 79617330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu if (draw != EGL_NO_SURFACE || read != EGL_NO_SURFACE || 79717330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu ctx != EGL_NO_CONTEXT) 798bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_FALSE); 79917330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu } 8002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!drv) 801bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(disp, EGL_TRUE); 80217330479b39409a63a06ec9e6b0f8e28b585db12Chia-I Wu 8032f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!context && ctx != EGL_NO_CONTEXT) 804bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE); 8056b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!draw_surf || !read_surf) { 8060ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor /* From the EGL 1.4 (20130211) spec: 8070ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor * 8080ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor * To release the current context without assigning a new one, set ctx 8090ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor * to EGL_NO_CONTEXT and set draw and read to EGL_NO_SURFACE. 8100ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor */ 8110ca0d5743fb42a956289a87efd4c8fcda88cf93aBeren Minor if (!disp->Extensions.KHR_surfaceless_context && ctx != EGL_NO_CONTEXT) 8126b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 8136b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 8146b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if ((!draw_surf && draw != EGL_NO_SURFACE) || 8156b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu (!read_surf && read != EGL_NO_SURFACE)) 8166b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 8176b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (draw_surf || read_surf) 8186b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE); 8196b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu } 8202f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 821b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.MakeCurrent(drv, disp, draw_surf, read_surf, context); 822b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 823bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 824adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 825adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 826adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8271ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 8282f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQueryContext(EGLDisplay dpy, EGLContext ctx, 8292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 830adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 831655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 832aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 833aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 834b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 835aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 8366a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_CONTEXT_KHR, context, EGL_FALSE); 8376a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 838bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONTEXT(disp, context, EGL_FALSE, drv); 839b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QueryContext(drv, disp, context, attribute, value); 840b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 841bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 842adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 843adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 844adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 845468cc866b4b308cee40470f06b31002c6c56da96Chad Versacestatic EGLSurface 846468cc866b4b308cee40470f06b31002c6c56da96Chad Versace_eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config, 847468cc866b4b308cee40470f06b31002c6c56da96Chad Versace void *native_window, const EGLint *attrib_list) 848adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 8492f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 8502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 8512f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 852b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 8532f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 85491ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh 85591ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh if (native_window == NULL) 85691ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 85791ff0d4c6510dc38f279c586ced17fba917873e7Sinclair Yeh 858a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#ifdef HAVE_SURFACELESS_PLATFORM 8595e97b8f5ce975dfb66cc46e6b4cc1e89eb8c1dc0Chad Versace if (disp && disp->Platform == _EGL_PLATFORM_SURFACELESS) { 860a597c8ad5b75f37336257e3f4462caebacb621efChad Versace /* From the EGL_MESA_platform_surfaceless spec (v1): 861a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * 862a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * eglCreatePlatformWindowSurface fails when called with a <display> 863a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * that belongs to the surfaceless platform. It returns 864a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * EGL_NO_SURFACE and generates EGL_BAD_NATIVE_WINDOW. The 865a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * justification for this unconditional failure is that the 866a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * surfaceless platform has no native windows, and therefore the 867a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * <native_window> parameter is always invalid. 868a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * 869a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * This check must occur before checking the EGLConfig, which emits 870a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * EGL_BAD_CONFIG. 871a597c8ad5b75f37336257e3f4462caebacb621efChad Versace */ 872a597c8ad5b75f37336257e3f4462caebacb621efChad Versace RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); 873a597c8ad5b75f37336257e3f4462caebacb621efChad Versace } 874a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#endif 875a597c8ad5b75f37336257e3f4462caebacb621efChad Versace 876a597c8ad5b75f37336257e3f4462caebacb621efChad Versace _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 877a597c8ad5b75f37336257e3f4462caebacb621efChad Versace 878fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace if ((conf->SurfaceType & EGL_WINDOW_BIT) == 0) 879fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE); 880fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace 881468cc866b4b308cee40470f06b31002c6c56da96Chad Versace surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window, 8826d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace attrib_list); 8834ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; 884b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 885bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 886adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 887adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 888adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 8891ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 890468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, 891468cc866b4b308cee40470f06b31002c6c56da96Chad Versace EGLNativeWindowType window, const EGLint *attrib_list) 892adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 893655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 8946a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 8956a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 896468cc866b4b308cee40470f06b31002c6c56da96Chad Versace STATIC_ASSERT(sizeof(void*) == sizeof(window)); 897468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglCreateWindowSurfaceCommon(disp, config, (void*) window, 898468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 899468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 900468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 9017d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brennemanstatic void * 9024729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom_fixupNativeWindow(_EGLDisplay *disp, void *native_window) 903468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 904468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#ifdef HAVE_X11_PLATFORM 905468cc866b4b308cee40470f06b31002c6c56da96Chad Versace if (disp->Platform == _EGL_PLATFORM_X11 && native_window != NULL) { 906468cc866b4b308cee40470f06b31002c6c56da96Chad Versace /* The `native_window` parameter for the X11 platform differs between 907468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * eglCreateWindowSurface() and eglCreatePlatformPixmapSurfaceEXT(). In 908468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * eglCreateWindowSurface(), the type of `native_window` is an Xlib 909468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * `Window`. In eglCreatePlatformWindowSurfaceEXT(), the type is 910468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * `Window*`. Convert `Window*` to `Window` because that's what 911468cc866b4b308cee40470f06b31002c6c56da96Chad Versace * dri2_x11_create_window_surface() expects. 912468cc866b4b308cee40470f06b31002c6c56da96Chad Versace */ 9137d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman return (void *)(* (Window*) native_window); 914468cc866b4b308cee40470f06b31002c6c56da96Chad Versace } 915468cc866b4b308cee40470f06b31002c6c56da96Chad Versace#endif 9167d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman return native_window; 9177d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman} 9187d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman 9197d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brennemanstatic EGLSurface EGLAPIENTRY 9207d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle BrennemaneglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, 9217d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman void *native_window, 9227d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman const EGLint *attrib_list) 9237d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman{ 9247d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 9257d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman 9264729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom native_window = _fixupNativeWindow(disp, native_window); 927468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 9286a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 929468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglCreateWindowSurfaceCommon(disp, config, native_window, 930468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 931468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 932468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 933468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 934820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLSurface EGLAPIENTRY 935820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, 936820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák void *native_window, 937820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák const EGLAttrib *attrib_list) 938820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{ 9397d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 940820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák EGLSurface surface; 9416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman EGLint *int_attribs; 9426a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 9436a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 944820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 9456a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman int_attribs = _eglConvertAttribsToInt(attrib_list); 946820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák if (attrib_list && !int_attribs) 9476a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE); 948820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 9494729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom native_window = _fixupNativeWindow(disp, native_window); 9507d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman surface = _eglCreateWindowSurfaceCommon(disp, config, native_window, 9517d7ae5e1c3451174a3c8dec2d50763a40069fe5bKyle Brenneman int_attribs); 952820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák free(int_attribs); 953820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák return surface; 954820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák} 955820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 9568cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brennemanstatic void * 9574729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom_fixupNativePixmap(_EGLDisplay *disp, void *native_pixmap) 9588cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman{ 9598cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman#ifdef HAVE_X11_PLATFORM 9608cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman /* The `native_pixmap` parameter for the X11 platform differs between 9618cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * eglCreatePixmapSurface() and eglCreatePlatformPixmapSurfaceEXT(). In 9628cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * eglCreatePixmapSurface(), the type of `native_pixmap` is an Xlib 9638cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * `Pixmap`. In eglCreatePlatformPixmapSurfaceEXT(), the type is 9648cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * `Pixmap*`. Convert `Pixmap*` to `Pixmap` because that's what 9658cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman * dri2_x11_create_pixmap_surface() expects. 9668cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman */ 9678cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman if (disp->Platform == _EGL_PLATFORM_X11 && native_pixmap != NULL) 9688cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman return (void *)(* (Pixmap*) native_pixmap); 9698cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman#endif 9708cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman return native_pixmap; 9718cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman} 972820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 973468cc866b4b308cee40470f06b31002c6c56da96Chad Versacestatic EGLSurface 974468cc866b4b308cee40470f06b31002c6c56da96Chad Versace_eglCreatePixmapSurfaceCommon(_EGLDisplay *disp, EGLConfig config, 975468cc866b4b308cee40470f06b31002c6c56da96Chad Versace void *native_pixmap, const EGLint *attrib_list) 976468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 9772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 9782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 9792f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 980b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 9812f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 982a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#if HAVE_SURFACELESS_PLATFORM 9835e97b8f5ce975dfb66cc46e6b4cc1e89eb8c1dc0Chad Versace if (disp && disp->Platform == _EGL_PLATFORM_SURFACELESS) { 984a597c8ad5b75f37336257e3f4462caebacb621efChad Versace /* From the EGL_MESA_platform_surfaceless spec (v1): 985a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * 986a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * [Like eglCreatePlatformWindowSurface,] eglCreatePlatformPixmapSurface 987a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * also fails when called with a <display> that belongs to the 988a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * surfaceless platform. It returns EGL_NO_SURFACE and generates 989a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * EGL_BAD_NATIVE_PIXMAP. 990a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * 991a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * This check must occur before checking the EGLConfig, which emits 992a597c8ad5b75f37336257e3f4462caebacb621efChad Versace * EGL_BAD_CONFIG. 993a597c8ad5b75f37336257e3f4462caebacb621efChad Versace */ 994a597c8ad5b75f37336257e3f4462caebacb621efChad Versace RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); 995a597c8ad5b75f37336257e3f4462caebacb621efChad Versace } 996a597c8ad5b75f37336257e3f4462caebacb621efChad Versace#endif 997a597c8ad5b75f37336257e3f4462caebacb621efChad Versace 998bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 999fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace 1000fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace if ((conf->SurfaceType & EGL_PIXMAP_BIT) == 0) 1001fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE); 1002fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace 1003468cc866b4b308cee40470f06b31002c6c56da96Chad Versace surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap, 10046d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace attrib_list); 10054ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; 1006b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1007bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1008adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1009adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1010adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10111ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 1012468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, 1013468cc866b4b308cee40470f06b31002c6c56da96Chad Versace EGLNativePixmapType pixmap, const EGLint *attrib_list) 1014468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 1015468cc866b4b308cee40470f06b31002c6c56da96Chad Versace _EGLDisplay *disp = _eglLockDisplay(dpy); 10166a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 10176a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 1018468cc866b4b308cee40470f06b31002c6c56da96Chad Versace STATIC_ASSERT(sizeof(void*) == sizeof(pixmap)); 1019468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglCreatePixmapSurfaceCommon(disp, config, (void*) pixmap, 1020468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 1021468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 1022468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 1023e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLSurface EGLAPIENTRY 1024468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceeglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, 1025468cc866b4b308cee40470f06b31002c6c56da96Chad Versace void *native_pixmap, 1026468cc866b4b308cee40470f06b31002c6c56da96Chad Versace const EGLint *attrib_list) 1027468cc866b4b308cee40470f06b31002c6c56da96Chad Versace{ 1028468cc866b4b308cee40470f06b31002c6c56da96Chad Versace _EGLDisplay *disp = _eglLockDisplay(dpy); 1029468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 10306a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 10314729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom native_pixmap = _fixupNativePixmap(disp, native_pixmap); 1032468cc866b4b308cee40470f06b31002c6c56da96Chad Versace return _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap, 1033468cc866b4b308cee40470f06b31002c6c56da96Chad Versace attrib_list); 1034468cc866b4b308cee40470f06b31002c6c56da96Chad Versace} 1035468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 1036468cc866b4b308cee40470f06b31002c6c56da96Chad Versace 1037468cc866b4b308cee40470f06b31002c6c56da96Chad VersaceEGLSurface EGLAPIENTRY 1038820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákeglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, 1039820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák void *native_pixmap, 1040820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák const EGLAttrib *attrib_list) 1041820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák{ 10428cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 1043820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák EGLSurface surface; 10446a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman EGLint *int_attribs; 10456a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 10466a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 1047820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 10486a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman int_attribs = _eglConvertAttribsToInt(attrib_list); 1049820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák if (attrib_list && !int_attribs) 10506a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_SURFACE); 1051820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 10524729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom native_pixmap = _fixupNativePixmap(disp, native_pixmap); 10538cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman surface = _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap, 10548cc3d9855f94cd0f2274a1831bc6fa8912ddea9cKyle Brenneman int_attribs); 1055820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák free(int_attribs); 1056820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák return surface; 1057820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák} 1058820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 1059820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák 1060820a4d402ad3891ec460882feab3801fbc646a65Marek OlšákEGLSurface EGLAPIENTRY 10612f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, 10622f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu const EGLint *attrib_list) 1063adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1064655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 10652f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 10662f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 10672f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 1068b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 10692f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 10706a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 1071bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 10722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1073fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace if ((conf->SurfaceType & EGL_PBUFFER_BIT) == 0) 1074fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SURFACE); 1075fbb4af96c6b6be08ed93e8d5a704b9f7002642f8Chad Versace 10762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePbufferSurface(drv, disp, conf, attrib_list); 10774ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; 1078b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1079bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1080adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1081adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1082adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10831ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1084adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglDestroySurface(EGLDisplay dpy, EGLSurface surface) 1085adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1086655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1087aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1088aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1089b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1090aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 10916a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1092bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 10932f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _eglUnlinkSurface(surf); 1094b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroySurface(drv, disp, surf); 1095b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1096bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1097adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1098adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 10991ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 11002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglQuerySurface(EGLDisplay dpy, EGLSurface surface, 11012f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint *value) 1102adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1103655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1104aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1105aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1106b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1107aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 11086a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1109bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1110b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.QuerySurface(drv, disp, surf, attribute, value); 1111b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1112bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1113adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1114adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 11151ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 11162f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, 11172f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu EGLint attribute, EGLint value) 1118adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1119655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1120aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1121aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1122b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1123aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 11246a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1125bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1126b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SurfaceAttrib(drv, disp, surf, attribute, value); 1127b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1128bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1129adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1130adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1131adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 11321ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1133adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1134adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1135655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1136aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1137aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1138b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1139aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 11406a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1141bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1142b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.BindTexImage(drv, disp, surf, buffer); 1143b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1144bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1145adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1146adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1147adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 11481ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1149adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) 1150adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1151655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1152aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1153aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1154b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1155aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 11566a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1157bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1158b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.ReleaseTexImage(drv, disp, surf, buffer); 1159b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1160bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1161adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1162adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1163adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 11641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1165adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglSwapInterval(EGLDisplay dpy, EGLint interval) 1166adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1167655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 116857da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 11696a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGLSurface *surf = ctx ? ctx->DrawSurface : NULL; 1170aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1171b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1172aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 11736a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1174bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 117557da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 1176d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1177d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu ctx->Resource.Display != disp) 1178bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_FALSE); 117957da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 1180d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetSurfaceHandle(surf) == EGL_NO_SURFACE) 1181bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 118257da499d7ba074128e8c97b8076805e403a2b9c4Chia-I Wu 1183b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SwapInterval(drv, disp, surf, interval); 1184b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1185bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1186adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1187adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1188adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 11891ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 11902f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I WueglSwapBuffers(EGLDisplay dpy, EGLSurface surface) 1191adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1192bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 1193655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1194aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1195aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1196b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1197aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 11986a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 1199bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 1200bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu 1201bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu /* surface must be bound to current context in EGL 1.4 */ 1202400b833592d9aad7b2c4627a897380642d52189fAlexander von Gluck IV #ifndef _EGL_BUILT_IN_DRIVER_HAIKU 1203d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1204d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu surf != ctx->DrawSurface) 1205bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 1206400b833592d9aad7b2c4627a897380642d52189fAlexander von Gluck IV #endif 1207b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1208b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.SwapBuffers(drv, disp, surf); 1209bbfd0e26151bef567c152c8018ecc15f04c70914Chia-I Wu 1210bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1211adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1212adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1213adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 12140a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean 12159702f9136646acc6981880faa3962a11aab1a603Eric Engestrom_eglSwapBuffersWithDamageCommon(_EGLDisplay *disp, _EGLSurface *surf, 12169702f9136646acc6981880faa3962a11aab1a603Eric Engestrom EGLint *rects, EGLint n_rects) 12176425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg{ 12186425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg _EGLContext *ctx = _eglGetCurrentContext(); 12196425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg _EGLDriver *drv; 12206425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg EGLBoolean ret; 12216425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 12226425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 12236425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 12246425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg /* surface must be bound to current context in EGL 1.4 */ 12256425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 12266425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg surf != ctx->DrawSurface) 12276425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 12286425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 12296425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg if ((n_rects > 0 && rects == NULL) || n_rects < 0) 12306425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 12316425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 12326425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg ret = drv->API.SwapBuffersWithDamageEXT(drv, disp, surf, rects, n_rects); 12336425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 12346425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg RETURN_EGL_EVAL(disp, ret); 12356425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg} 12366425b14515e3124d6d1fe2d39fa192389aab9f85Robert Bragg 12370a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean EGLAPIENTRY 12380a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageEXT(EGLDisplay dpy, EGLSurface surface, 12390a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom EGLint *rects, EGLint n_rects) 12400a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom{ 12410a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGLDisplay *disp = _eglLockDisplay(dpy); 12420a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGLSurface *surf = _eglLookupSurface(surface, disp); 12430a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 12449702f9136646acc6981880faa3962a11aab1a603Eric Engestrom return _eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects); 12450a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom} 12460a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom 12470a606a400fe382a9bc726beef269b47f4485d85fEric Engestromstatic EGLBoolean EGLAPIENTRY 12480a606a400fe382a9bc726beef269b47f4485d85fEric EngestromeglSwapBuffersWithDamageKHR(EGLDisplay dpy, EGLSurface surface, 12490a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom EGLint *rects, EGLint n_rects) 12500a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom{ 12510a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGLDisplay *disp = _eglLockDisplay(dpy); 12520a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGLSurface *surf = _eglLookupSurface(surface, disp); 12530a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 12549702f9136646acc6981880faa3962a11aab1a603Eric Engestrom return _eglSwapBuffersWithDamageCommon(disp, surf, rects, n_rects); 12550a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom} 12560a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom 12571ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 12584aed0944f4b8b8d14d210cf6bc87ccddfa9a77ecChia-I WueglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) 1259adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1260655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1261aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLSurface *surf = _eglLookupSurface(surface, disp); 1262aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu _EGLDriver *drv; 1263b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 12646d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace void *native_pixmap_ptr; 12656d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace 12666a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 12676d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace STATIC_ASSERT(sizeof(void*) == sizeof(target)); 12686d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace native_pixmap_ptr = (void*) target; 1269aed7358e54fd143033d240c6e543d403da2d7336Chia-I Wu 1270bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 127185fe9484945cb57ffd49df248b0e5057eba6af04Benjamin Franzke if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay)) 1272f22665df95406567193dee0089f4830664ff4101Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE); 12736d1f83ec09164bd805c90785635bbcf861b403e5Chad Versace ret = drv->API.CopyBuffers(drv, disp, surf, native_pixmap_ptr); 1274b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1275bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1276adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1277adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1278adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 127982a2e2cb5024c37a1779594320f23f225a83c79dKyle Brennemanstatic EGLBoolean 128082a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman_eglWaitClientCommon(void) 1281adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 12826c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 12836c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLDisplay *disp; 12842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 1285b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 12862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 12876c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!ctx) 1288bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 12892f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1290ecb3b3102a3022e31cf9d75ae099eddbe298517fChia-I Wu disp = ctx->Resource.Display; 1291efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov mtx_lock(&disp->Mutex); 1292655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 1293655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu /* let bad current context imply bad current surface */ 1294d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1295d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE) 1296bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 1297b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1298b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* a valid current context implies an initialized current display */ 1299a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu assert(disp->Initialized); 13002f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = disp->Driver; 1301b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.WaitClient(drv, disp, ctx); 13026c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 1303bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 13046c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu} 13056c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu 130682a2e2cb5024c37a1779594320f23f225a83c79dKyle BrennemanEGLBoolean EGLAPIENTRY 130782a2e2cb5024c37a1779594320f23f225a83c79dKyle BrennemaneglWaitClient(void) 130882a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman{ 13096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext(), EGL_FALSE); 131082a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman return _eglWaitClientCommon(); 131182a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman} 13122f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 13136c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WuEGLBoolean EGLAPIENTRY 13146c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I WueglWaitGL(void) 13156c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu{ 13166e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman /* Since we only support OpenGL and GLES, eglWaitGL is equivalent to eglWaitClient. */ 13176a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_CONTEXT_KHR, _eglGetCurrentContext(), EGL_FALSE); 131882a2e2cb5024c37a1779594320f23f225a83c79dKyle Brenneman return _eglWaitClientCommon(); 1319adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1320adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1321adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 13221ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLBoolean EGLAPIENTRY 1323adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglWaitNative(EGLint engine) 1324adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 13256c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 13266c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu _EGLDisplay *disp; 13272f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 1328b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 13292f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 13306c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu if (!ctx) 1331bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 1332b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 13336a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE); 13346a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1335655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu disp = ctx->Resource.Display; 1336efe87f1a801c61d087cd2b29a2c150453241c3d4Emil Velikov mtx_lock(&disp->Mutex); 1337655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu 13386c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu /* let bad current context imply bad current surface */ 1339d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1340d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu _eglGetSurfaceHandle(ctx->DrawSurface) == EGL_NO_SURFACE) 1341bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CURRENT_SURFACE, EGL_FALSE); 1342b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1343b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* a valid current context implies an initialized current display */ 1344a933259daa98615ad7473c53623a96f612e9a311Chia-I Wu assert(disp->Initialized); 13452f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu drv = disp->Driver; 1346b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.WaitNative(drv, disp, engine); 13472f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 1348bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1349adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1350adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1351adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 13521ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLDisplay EGLAPIENTRY 1353adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentDisplay(void) 1354adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1355a1717970e78d897f527273278bf1346cc86a5741Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 1356b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLDisplay ret; 1357b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1358b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = (ctx) ? _eglGetDisplayHandle(ctx->Resource.Display) : EGL_NO_DISPLAY; 1359b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1360bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 1361adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1362adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1363adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 13641ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLContext EGLAPIENTRY 1365adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentContext(void) 1366adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 1367adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul _EGLContext *ctx = _eglGetCurrentContext(); 1368b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLContext ret; 1369b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1370b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = _eglGetContextHandle(ctx); 1371b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1372bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 1373adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1374adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1375adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 13761ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLSurface EGLAPIENTRY 1377adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetCurrentSurface(EGLint readdraw) 1378adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 137961906631202af855d0742586956ff9f34522a525Chia-I Wu _EGLContext *ctx = _eglGetCurrentContext(); 1380b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLint err = EGL_SUCCESS; 138161906631202af855d0742586956ff9f34522a525Chia-I Wu _EGLSurface *surf; 1382b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 138361906631202af855d0742586956ff9f34522a525Chia-I Wu 13846a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_NO_SURFACE); 13856a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 138661906631202af855d0742586956ff9f34522a525Chia-I Wu if (!ctx) 1387bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_NO_SURFACE); 138861906631202af855d0742586956ff9f34522a525Chia-I Wu 138961906631202af855d0742586956ff9f34522a525Chia-I Wu switch (readdraw) { 139061906631202af855d0742586956ff9f34522a525Chia-I Wu case EGL_DRAW: 139161906631202af855d0742586956ff9f34522a525Chia-I Wu surf = ctx->DrawSurface; 139261906631202af855d0742586956ff9f34522a525Chia-I Wu break; 139361906631202af855d0742586956ff9f34522a525Chia-I Wu case EGL_READ: 139461906631202af855d0742586956ff9f34522a525Chia-I Wu surf = ctx->ReadSurface; 139561906631202af855d0742586956ff9f34522a525Chia-I Wu break; 139661906631202af855d0742586956ff9f34522a525Chia-I Wu default: 139761906631202af855d0742586956ff9f34522a525Chia-I Wu surf = NULL; 1398b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu err = EGL_BAD_PARAMETER; 139961906631202af855d0742586956ff9f34522a525Chia-I Wu break; 140061906631202af855d0742586956ff9f34522a525Chia-I Wu } 140161906631202af855d0742586956ff9f34522a525Chia-I Wu 1402b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = _eglGetSurfaceHandle(surf); 1403b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1404bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, err, ret); 1405adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1406adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1407adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 14081ed1027e886980b9b0f48fa6bfcf3d6e209c7787Brian PaulEGLint EGLAPIENTRY 1409adbff7e977c7c768e752a24fb643d68bdf961bfeBrian PauleglGetError(void) 1410adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{ 141148822796339cb4a55714dc3f1abbe379562ec538Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 141248822796339cb4a55714dc3f1abbe379562ec538Brian Paul EGLint e = t->LastError; 141375da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu if (!_eglIsCurrentThreadDummy()) 141475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu t->LastError = EGL_SUCCESS; 1415adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul return e; 1416adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul} 1417adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1418adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul 1419b2006a40eb22899d38cd31691640555228e36975Brian Paul/** 1420b2006a40eb22899d38cd31691640555228e36975Brian Paul ** EGL 1.2 1421b2006a40eb22899d38cd31691640555228e36975Brian Paul **/ 1422b2006a40eb22899d38cd31691640555228e36975Brian Paul 1423d5078b94323241a6482f54797756116b1c864327Brian Paul/** 1424d5078b94323241a6482f54797756116b1c864327Brian Paul * Specify the client API to use for subsequent calls including: 1425d5078b94323241a6482f54797756116b1c864327Brian Paul * eglCreateContext() 1426d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentContext() 1427d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentDisplay() 1428d5078b94323241a6482f54797756116b1c864327Brian Paul * eglGetCurrentSurface() 1429d5078b94323241a6482f54797756116b1c864327Brian Paul * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT) 1430d5078b94323241a6482f54797756116b1c864327Brian Paul * eglWaitClient() 1431d5078b94323241a6482f54797756116b1c864327Brian Paul * eglWaitNative() 1432d5078b94323241a6482f54797756116b1c864327Brian Paul * See section 3.7 "Rendering Context" in the EGL specification for details. 1433d5078b94323241a6482f54797756116b1c864327Brian Paul */ 1434c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY 1435b2006a40eb22899d38cd31691640555228e36975Brian PauleglBindAPI(EGLenum api) 1436b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 14376a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGLThreadInfo *t; 1438b2006a40eb22899d38cd31691640555228e36975Brian Paul 14396a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE); 14406a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 14416a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman t = _eglGetCurrentThread(); 144275da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu if (_eglIsCurrentThreadDummy()) 1443bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_FALSE); 144475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu 144521b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu if (!_eglIsApiValid(api)) 1446bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, EGL_FALSE); 144721b635ffa8b59049a95d50d4c7b7a8ff6413b730Chia-I Wu 14486e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman t->CurrentAPI = api; 1449b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1450bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 1451b2006a40eb22899d38cd31691640555228e36975Brian Paul} 1452b2006a40eb22899d38cd31691640555228e36975Brian Paul 1453b2006a40eb22899d38cd31691640555228e36975Brian Paul 1454d5078b94323241a6482f54797756116b1c864327Brian Paul/** 1455d5078b94323241a6482f54797756116b1c864327Brian Paul * Return the last value set with eglBindAPI(). 1456d5078b94323241a6482f54797756116b1c864327Brian Paul */ 1457c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLenum EGLAPIENTRY 1458d5078b94323241a6482f54797756116b1c864327Brian PauleglQueryAPI(void) 1459d5078b94323241a6482f54797756116b1c864327Brian Paul{ 1460d5078b94323241a6482f54797756116b1c864327Brian Paul _EGLThreadInfo *t = _eglGetCurrentThread(); 1461b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLenum ret; 1462b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1463b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */ 14646e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman ret = t->CurrentAPI; 1465b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1466bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, ret); 1467d5078b94323241a6482f54797756116b1c864327Brian Paul} 1468d5078b94323241a6482f54797756116b1c864327Brian Paul 1469d5078b94323241a6482f54797756116b1c864327Brian Paul 1470c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLSurface EGLAPIENTRY 1471b2006a40eb22899d38cd31691640555228e36975Brian PauleglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, 1472b2006a40eb22899d38cd31691640555228e36975Brian Paul EGLClientBuffer buffer, EGLConfig config, 1473b2006a40eb22899d38cd31691640555228e36975Brian Paul const EGLint *attrib_list) 1474b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 1475655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 14762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLConfig *conf = _eglLookupConfig(config, disp); 14772f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLDriver *drv; 14782f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu _EGLSurface *surf; 1479b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLSurface ret; 14802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 14816a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_SURFACE); 14826a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1483bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); 14842f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 14852f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu surf = drv->API.CreatePbufferFromClientBuffer(drv, disp, buftype, buffer, 14862f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu conf, attrib_list); 14874ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; 1488b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1489bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1490b2006a40eb22899d38cd31691640555228e36975Brian Paul} 1491b2006a40eb22899d38cd31691640555228e36975Brian Paul 1492b2006a40eb22899d38cd31691640555228e36975Brian Paul 1493c43ab4fe1fbb13bbfe70680c6c608ff0da73be9anobledEGLBoolean EGLAPIENTRY 1494b2006a40eb22899d38cd31691640555228e36975Brian PauleglReleaseThread(void) 1495b2006a40eb22899d38cd31691640555228e36975Brian Paul{ 149611cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu /* unbind current contexts */ 14972f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu if (!_eglIsCurrentThreadDummy()) { 149811cf3cb2c463cf8af8a7e63eb9521979bfd303f8Chia-I Wu _EGLThreadInfo *t = _eglGetCurrentThread(); 14996e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman _EGLContext *ctx = t->CurrentContext; 15006a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 15016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_OBJECT_THREAD_KHR, NULL, EGL_FALSE); 15026a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 15036e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman if (ctx) { 15046e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman _EGLDisplay *disp = ctx->Resource.Display; 15056e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman _EGLDriver *drv; 15066e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman 15076e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman mtx_lock(&disp->Mutex); 15086e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman drv = disp->Driver; 15096e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman (void) drv->API.MakeCurrent(drv, disp, NULL, NULL, NULL); 15106e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman mtx_unlock(&disp->Mutex); 15116e066f76ee22909b0653ff8b89429de819e60f14Kyle Brenneman } 1512b2006a40eb22899d38cd31691640555228e36975Brian Paul } 15132f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu 151475da80b29556e6dbbba21e5297ca440e475f65cbChia-I Wu _eglDestroyCurrentThread(); 1515b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1516bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_SUCCESS(NULL, EGL_TRUE); 1517b2006a40eb22899d38cd31691640555228e36975Brian Paul} 15187012d01d888d482f2c6ad1180231a482026d213aJon Smirl 15197012d01d888d482f2c6ad1180231a482026d213aJon Smirl 152058338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brennemanstatic EGLImage 152158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman_eglCreateImageCommon(_EGLDisplay *disp, EGLContext ctx, EGLenum target, 1522a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu EGLClientBuffer buffer, const EGLint *attr_list) 1523a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{ 1524a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLContext *context = _eglLookupContext(ctx, disp); 1525a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDriver *drv; 1526a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLImage *img; 1527d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák EGLImage ret; 1528a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1529bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv); 15306b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!disp->Extensions.KHR_image_base) 15316b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR); 1532b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu if (!context && ctx != EGL_NO_CONTEXT) 1533bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR); 15340de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen /* "If <target> is EGL_LINUX_DMA_BUF_EXT, <dpy> must be a valid display, 15350de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen * <ctx> must be EGL_NO_CONTEXT..." 15360de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen */ 15370de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen if (ctx != EGL_NO_CONTEXT && target == EGL_LINUX_DMA_BUF_EXT) 15380de013b61930505bbeaf094d079b566df18a0cf7Topi Pohjolainen RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR); 1539a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1540a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu img = drv->API.CreateImageKHR(drv, 1541a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu disp, context, target, buffer, attr_list); 15424ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR; 1543b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1544bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1545a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu} 1546a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 154758338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brennemanstatic EGLImage EGLAPIENTRY 154858338c6b650d85a2484f50c0941cb3e2947fab8eKyle BrennemaneglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, 154958338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman EGLClientBuffer buffer, const EGLint *attr_list) 155058338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman{ 155158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 15526a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_IMAGE_KHR); 155358338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman return _eglCreateImageCommon(disp, ctx, target, buffer, attr_list); 155458338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman} 155558338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman 1556a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1557515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek OlšákEGLImage EGLAPIENTRY 1558515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek OlšákeglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, 1559515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák EGLClientBuffer buffer, const EGLAttrib *attr_list) 1560515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák{ 156158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 1562515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák EGLImage image; 15636a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman EGLint *int_attribs; 15646a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 15656a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_NO_IMAGE_KHR); 1566515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 15676a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman int_attribs = _eglConvertAttribsToInt(attr_list); 1568515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák if (attr_list && !int_attribs) 156958338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_ALLOC, EGL_NO_IMAGE); 1570515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 157158338c6b650d85a2484f50c0941cb3e2947fab8eKyle Brenneman image = _eglCreateImageCommon(disp, ctx, target, buffer, int_attribs); 1572515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák free(int_attribs); 1573515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák return image; 1574515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák} 1575515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 1576515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák 15772885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLBoolean EGLAPIENTRY 15782885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglDestroyImage(EGLDisplay dpy, EGLImage image) 1579a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu{ 1580655f4654675e601a9482e40d8e50156c965b8934Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 1581a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLImage *img = _eglLookupImage(image, disp); 1582a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _EGLDriver *drv; 1583b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu EGLBoolean ret; 1584a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 15856a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); 15866a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1587bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 15886b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!disp->Extensions.KHR_image_base) 15896b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_EVAL(disp, EGL_FALSE); 1590a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (!img) 1591bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1592a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1593a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu _eglUnlinkImage(img); 1594b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu ret = drv->API.DestroyImageKHR(drv, disp, img); 1595b3bb18062005d3c9ec0f942a5e096e7e38c6f3e1Chia-I Wu 1596bef4b476d729320599264483113d577ac5eeaff1Chia-I Wu RETURN_EGL_EVAL(disp, ret); 1597a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu} 1598a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1599a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1600d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLSync 1601804488518296fbf20b06244bc0aa2e2793c61998Chad Versace_eglCreateSync(_EGLDisplay *disp, EGLenum type, const EGLAttrib *attrib_list, 1602804488518296fbf20b06244bc0aa2e2793c61998Chad Versace EGLBoolean orig_is_EGLAttrib, 160351c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák EGLenum invalid_type_error) 16044eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 16059a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák _EGLContext *ctx = _eglGetCurrentContext(); 16064eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 16074eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLSync *sync; 1608d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák EGLSync ret; 16094eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 16104eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_DISPLAY(disp, EGL_NO_SYNC_KHR, drv); 16119a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák 1612804488518296fbf20b06244bc0aa2e2793c61998Chad Versace if (!disp->Extensions.KHR_cl_event2 && orig_is_EGLAttrib) { 1613f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace /* There exist two EGLAttrib variants of eglCreateSync*: 1614f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * eglCreateSync64KHR which requires EGL_KHR_cl_event2, and eglCreateSync 1615f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * which requires EGL 1.5. Here we use the presence of EGL_KHR_cl_event2 1616f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * support as a proxy for EGL 1.5 support, even though that's not 1617f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * entirely correct (though _eglComputeVersion does the same). 1618f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * 1619f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * The EGL spec provides no guidance on how to handle unsupported 1620f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace * functions. EGL_BAD_MATCH seems reasonable. 1621f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace */ 1622f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 1623f2c2f43d4ea2948e8fd9be1ab192664df262c0f4Chad Versace } 1624290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 16256bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli /* If type is EGL_SYNC_FENCE and no context is current for the bound API 16266bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli * (i.e., eglGetCurrentContext returns EGL_NO_CONTEXT ), an EGL_BAD_MATCH 16276bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli * error is generated. 16286bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli */ 16290201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark if (!ctx && 16300201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark (type == EGL_SYNC_FENCE_KHR || type == EGL_SYNC_NATIVE_FENCE_ANDROID)) 16316bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 16326bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli 16339a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák /* return an error if the client API doesn't support GL_OES_EGL_sync */ 16346bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli if (ctx && (ctx->Resource.Display != disp || 16356bf6fcfcd9a916530bfbd47351bd1f0df47c4a3dTapani Pälli ctx->ClientAPI != EGL_OPENGL_ES_API)) 16369a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_NO_SYNC_KHR); 16379a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák 16389a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák switch (type) { 16399a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák case EGL_SYNC_FENCE_KHR: 16409a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák if (!disp->Extensions.KHR_fence_sync) 164151c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 16429a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák break; 16439a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák case EGL_SYNC_REUSABLE_KHR: 16449a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák if (!disp->Extensions.KHR_reusable_sync) 164551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 16469a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák break; 1647290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák case EGL_SYNC_CL_EVENT_KHR: 1648290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák if (!disp->Extensions.KHR_cl_event2) 164951c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 1650290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák break; 16510201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark case EGL_SYNC_NATIVE_FENCE_ANDROID: 16520201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark if (!disp->Extensions.ANDROID_native_fence_sync) 16530201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 16540201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark break; 16559a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák default: 165651c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák RETURN_EGL_ERROR(disp, invalid_type_error, EGL_NO_SYNC_KHR); 16579a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák } 16584eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 1659804488518296fbf20b06244bc0aa2e2793c61998Chad Versace sync = drv->API.CreateSyncKHR(drv, disp, type, attrib_list); 16604ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (sync) ? _eglLinkSync(sync) : EGL_NO_SYNC_KHR; 16614eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 16624eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu RETURN_EGL_EVAL(disp, ret); 16634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 16644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 16654eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 1666d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLSync EGLAPIENTRY 1667804488518296fbf20b06244bc0aa2e2793c61998Chad VersaceeglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *int_list) 1668290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák{ 16699a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 16706a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 1671804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1672804488518296fbf20b06244bc0aa2e2793c61998Chad Versace EGLSync sync; 1673804488518296fbf20b06244bc0aa2e2793c61998Chad Versace EGLAttrib *attrib_list; 1674804488518296fbf20b06244bc0aa2e2793c61998Chad Versace EGLint err; 1675804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1676804488518296fbf20b06244bc0aa2e2793c61998Chad Versace if (sizeof(int_list[0]) == sizeof(attrib_list[0])) { 1677804488518296fbf20b06244bc0aa2e2793c61998Chad Versace attrib_list = (EGLAttrib *) int_list; 1678804488518296fbf20b06244bc0aa2e2793c61998Chad Versace } else { 1679804488518296fbf20b06244bc0aa2e2793c61998Chad Versace err = _eglConvertIntsToAttribs(int_list, &attrib_list); 1680804488518296fbf20b06244bc0aa2e2793c61998Chad Versace if (err != EGL_SUCCESS) 1681804488518296fbf20b06244bc0aa2e2793c61998Chad Versace RETURN_EGL_ERROR(disp, err, EGL_NO_SYNC); 1682804488518296fbf20b06244bc0aa2e2793c61998Chad Versace } 1683804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1684804488518296fbf20b06244bc0aa2e2793c61998Chad Versace sync = _eglCreateSync(disp, type, attrib_list, EGL_FALSE, 168551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák EGL_BAD_ATTRIBUTE); 1686804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1687804488518296fbf20b06244bc0aa2e2793c61998Chad Versace if (sizeof(int_list[0]) != sizeof(attrib_list[0])) 1688804488518296fbf20b06244bc0aa2e2793c61998Chad Versace free(attrib_list); 1689804488518296fbf20b06244bc0aa2e2793c61998Chad Versace 1690804488518296fbf20b06244bc0aa2e2793c61998Chad Versace /* Don't double-unlock the display. _eglCreateSync already unlocked it. */ 1691804488518296fbf20b06244bc0aa2e2793c61998Chad Versace return sync; 169251c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák} 169351c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák 169451c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák 169551c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšákstatic EGLSync EGLAPIENTRY 169651c8c66e1d81d03f0db6aee0a510aa85c277053eMarek OlšákeglCreateSync64KHR(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list) 169751c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák{ 16989a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 16996a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 1700804488518296fbf20b06244bc0aa2e2793c61998Chad Versace return _eglCreateSync(disp, type, attrib_list, EGL_TRUE, 170151c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák EGL_BAD_ATTRIBUTE); 1702290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák} 1703290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 1704290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 17052885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLSync EGLAPIENTRY 17062885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list) 1707290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák{ 17089a992038e722b6ea8362db1dfcf2dd5a78888391Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 17096a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 1710804488518296fbf20b06244bc0aa2e2793c61998Chad Versace return _eglCreateSync(disp, type, attrib_list, EGL_TRUE, 171151c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák EGL_BAD_PARAMETER); 1712290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák} 1713290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 1714290a3eb7507f7f2949753a77c425ed2bb6fd0dd1Marek Olšák 17152885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLBoolean EGLAPIENTRY 17162885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglDestroySync(EGLDisplay dpy, EGLSync sync) 17174eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 17184eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 17194eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLSync *s = _eglLookupSync(sync, disp); 17204eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 17214eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu EGLBoolean ret; 17224eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17236a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 17246a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 17254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 17269a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák assert(disp->Extensions.KHR_reusable_sync || 17270201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark disp->Extensions.KHR_fence_sync || 17280201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark disp->Extensions.ANDROID_native_fence_sync); 17296b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 17304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _eglUnlinkSync(s); 17314eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu ret = drv->API.DestroySyncKHR(drv, disp, s); 17324eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17334eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu RETURN_EGL_EVAL(disp, ret); 17344eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 17354eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17364eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17372885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákEGLint EGLAPIENTRY 17382885ba0e4cea102d77832e2af4b212d00ab5edd4Marek OlšákeglClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout) 17394eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 17404eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 17414eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLSync *s = _eglLookupSync(sync, disp); 17424eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 17434eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu EGLint ret; 17444eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17456a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 17466a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 17474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 17489a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák assert(disp->Extensions.KHR_reusable_sync || 17490201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark disp->Extensions.KHR_fence_sync || 17500201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark disp->Extensions.ANDROID_native_fence_sync); 17519a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák 17529a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák if (s->SyncStatus == EGL_SIGNALED_KHR) 17539a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák RETURN_EGL_EVAL(disp, EGL_CONDITION_SATISFIED_KHR); 17549a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák 175570299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim /* if sync type is EGL_SYNC_REUSABLE_KHR, dpy should be 175670299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim * unlocked here to allow other threads also to be able to 175770299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim * go into waiting state. 175870299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim */ 175970299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim 176070299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim if (s->Type == EGL_SYNC_REUSABLE_KHR) 176170299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim _eglUnlockDisplay(dpy); 176270299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim 17634eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu ret = drv->API.ClientWaitSyncKHR(drv, disp, s, flags, timeout); 17644eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 176570299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim /* 176670299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim * 'disp' is already unlocked for reusable sync type, 176770299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim * so passing 'NULL' to bypass unlocking display. 176870299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim */ 176970299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim if (s->Type == EGL_SYNC_REUSABLE_KHR) 177070299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim RETURN_EGL_EVAL(NULL, ret); 177170299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim else 177270299474f58ad7c0299ea5f997019880d1c4deefDongwon Kim RETURN_EGL_EVAL(disp, ret); 17734eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 17744eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17754eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 17765b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brennemanstatic EGLint 17775b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman_eglWaitSyncCommon(_EGLDisplay *disp, _EGLSync *s, EGLint flags) 1778a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák{ 1779a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák _EGLContext *ctx = _eglGetCurrentContext(); 1780a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák _EGLDriver *drv; 1781a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák EGLint ret; 1782a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1783a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 1784a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák assert(disp->Extensions.KHR_wait_sync); 1785a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1786a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák /* return an error if the client API doesn't support GL_OES_EGL_sync */ 1787a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák if (ctx == EGL_NO_CONTEXT || ctx->ClientAPI != EGL_OPENGL_ES_API) 1788a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák RETURN_EGL_ERROR(disp, EGL_BAD_MATCH, EGL_FALSE); 1789a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1790a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák /* the API doesn't allow any flags yet */ 1791a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák if (flags != 0) 1792a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1793a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1794a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák ret = drv->API.WaitSyncKHR(drv, disp, s); 1795a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 1796a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák RETURN_EGL_EVAL(disp, ret); 1797a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák} 1798a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 17995b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brennemanstatic EGLint EGLAPIENTRY 18005b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle BrennemaneglWaitSyncKHR(EGLDisplay dpy, EGLSync sync, EGLint flags) 18015b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman{ 18025b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 18035b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman _EGLSync *s = _eglLookupSync(sync, disp); 18046a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 18055b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman return _eglWaitSyncCommon(disp, s, flags); 18065b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman} 18075b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman 1808a8617cc0428dcc8340cb85776e122c6534a0fa11Marek Olšák 18097524592da6305d52e95d718691d5a6665738aadeMarek OlšákEGLBoolean EGLAPIENTRY 18107524592da6305d52e95d718691d5a6665738aadeMarek OlšákeglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags) 18117524592da6305d52e95d718691d5a6665738aadeMarek Olšák{ 18127524592da6305d52e95d718691d5a6665738aadeMarek Olšák /* The KHR version returns EGLint, while the core version returns 18137524592da6305d52e95d718691d5a6665738aadeMarek Olšák * EGLBoolean. In both cases, the return values can only be EGL_FALSE and 18147524592da6305d52e95d718691d5a6665738aadeMarek Olšák * EGL_TRUE. 18157524592da6305d52e95d718691d5a6665738aadeMarek Olšák */ 18165b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 18175b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman _EGLSync *s = _eglLookupSync(sync, disp); 18186a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 18195b0b844ac9818672bc3ddcdbbb74cb892b3485f4Kyle Brenneman return _eglWaitSyncCommon(disp, s, flags); 18207524592da6305d52e95d718691d5a6665738aadeMarek Olšák} 18217524592da6305d52e95d718691d5a6665738aadeMarek Olšák 18227524592da6305d52e95d718691d5a6665738aadeMarek Olšák 1823e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 1824d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglSignalSyncKHR(EGLDisplay dpy, EGLSync sync, EGLenum mode) 18254eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 18264eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDisplay *disp = _eglLockDisplay(dpy); 18274eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLSync *s = _eglLookupSync(sync, disp); 18284eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 18294eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu EGLBoolean ret; 18304eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 18316a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 18326a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 18334eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 18346b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu assert(disp->Extensions.KHR_reusable_sync); 18354eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu ret = drv->API.SignalSyncKHR(drv, disp, s, mode); 18364eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 18374eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu RETURN_EGL_EVAL(disp, ret); 18384eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 18394eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 18404eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 18411d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brennemanstatic EGLBoolean 18421d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman_eglGetSyncAttribCommon(_EGLDisplay *disp, _EGLSync *s, EGLint attribute, EGLAttrib *value) 18434eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu{ 18444eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGLDriver *drv; 18454eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu EGLBoolean ret; 18464eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 18474eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_SYNC(disp, s, EGL_FALSE, drv); 18489a0bda2430f10fbf43c64573412d97b6cc38e5d7Marek Olšák assert(disp->Extensions.KHR_reusable_sync || 18490201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark disp->Extensions.KHR_fence_sync || 18500201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark disp->Extensions.ANDROID_native_fence_sync); 18511e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák ret = drv->API.GetSyncAttrib(drv, disp, s, attribute, value); 18524eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 18534eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu RETURN_EGL_EVAL(disp, ret); 18544eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu} 18554eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 18561d535c1e83ae45b67a141420298c5d08082e0ed8Kyle BrennemanEGLBoolean EGLAPIENTRY 18571d535c1e83ae45b67a141420298c5d08082e0ed8Kyle BrennemaneglGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value) 18581d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman{ 18591d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 18601d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman _EGLSync *s = _eglLookupSync(sync, disp); 18616a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 18621d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman return _eglGetSyncAttribCommon(disp, s, attribute, value); 18631d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman} 18641d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman 18654eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 18661e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšákstatic EGLBoolean EGLAPIENTRY 18671e79e054e7dff0c45538fff1257e1f81a206d7c9Marek OlšákeglGetSyncAttribKHR(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLint *value) 18681e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák{ 18691d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman _EGLDisplay *disp = _eglLockDisplay(dpy); 18701d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman _EGLSync *s = _eglLookupSync(sync, disp); 1871d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim EGLAttrib attrib; 1872d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim EGLBoolean result; 1873d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim 18746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 18756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1876d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim if (!value) 187717084b6f9340f798111e53e08f5d35c7630cee48Chad Versace RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1878d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim 1879d1e1563bb63f08cdfec1b40b105bec7f343bc0b8Dongwon Kim attrib = *value; 18801d535c1e83ae45b67a141420298c5d08082e0ed8Kyle Brenneman result = _eglGetSyncAttribCommon(disp, s, attribute, &attrib); 18811e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák 18821e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák /* The EGL_KHR_fence_sync spec says this about eglGetSyncAttribKHR: 18831e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák * 18841e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák * If any error occurs, <*value> is not modified. 18851e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák */ 18861e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák if (result == EGL_FALSE) 18871e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák return result; 18881e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák 18891e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák *value = attrib; 18901e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák return result; 18911e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák} 18921e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák 18930201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clarkstatic EGLint EGLAPIENTRY 18940201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob ClarkeglDupNativeFenceFDANDROID(EGLDisplay dpy, EGLSync sync) 18950201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark{ 18960201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark _EGLDisplay *disp = _eglLockDisplay(dpy); 18970201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark _EGLSync *s = _eglLookupSync(sync, disp); 18980201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark _EGLDriver *drv; 18990201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark EGLBoolean ret; 19000201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark 19010201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark _EGL_FUNC_START(disp, EGL_OBJECT_SYNC_KHR, s, EGL_FALSE); 19020201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark 19030201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark /* the spec doesn't seem to specify what happens if the fence 19040201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark * type is not EGL_SYNC_NATIVE_FENCE_ANDROID, but this seems 19050201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark * sensible: 19060201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark */ 19070201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark if (!(s && (s->Type == EGL_SYNC_NATIVE_FENCE_ANDROID))) 19080201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_NO_NATIVE_FENCE_FD_ANDROID); 19090201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark 19100201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark _EGL_CHECK_SYNC(disp, s, EGL_NO_NATIVE_FENCE_FD_ANDROID, drv); 19110201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark assert(disp->Extensions.ANDROID_native_fence_sync); 19120201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark ret = drv->API.DupNativeFenceFDANDROID(drv, disp, s); 19130201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark 19140201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark RETURN_EGL_EVAL(disp, ret); 19150201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark} 19161e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák 1917e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 191852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian HøgsbergeglSwapBuffersRegionNOK(EGLDisplay dpy, EGLSurface surface, 191952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg EGLint numRects, const EGLint *rects) 192052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg{ 192152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLContext *ctx = _eglGetCurrentContext(); 192252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 192352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLSurface *surf = _eglLookupSurface(surface, disp); 192452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGLDriver *drv; 192552c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg EGLBoolean ret; 192652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 19276a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 19286a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 192952c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 193052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 19316b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!disp->Extensions.NOK_swap_region) 19326b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_EVAL(disp, EGL_FALSE); 19336b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 193452c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg /* surface must be bound to current context in EGL 1.4 */ 1935d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu if (_eglGetContextHandle(ctx) == EGL_NO_CONTEXT || 1936d19afc57fe49816f3f3290410e0124d326577be2Chia-I Wu surf != ctx->DrawSurface) 193752c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_BAD_SURFACE, EGL_FALSE); 193852c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 19396b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu ret = drv->API.SwapBuffersRegionNOK(drv, disp, surf, numRects, rects); 194052c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 194152c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 194252c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg} 194352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg 1944b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1945d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšákstatic EGLImage EGLAPIENTRY 1946b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian HøgsbergeglCreateDRMImageMESA(EGLDisplay dpy, const EGLint *attr_list) 1947b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{ 1948b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 1949b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLDriver *drv; 1950b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLImage *img; 1951d333d30632516b1fc5b60181c2c237653e55a8e1Marek Olšák EGLImage ret; 1952b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 19536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 19546a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1955b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGL_CHECK_DISPLAY(disp, EGL_NO_IMAGE_KHR, drv); 19566b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu if (!disp->Extensions.MESA_drm_image) 19576b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu RETURN_EGL_EVAL(disp, EGL_NO_IMAGE_KHR); 1958b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1959b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg img = drv->API.CreateDRMImageMESA(drv, disp, attr_list); 19604ce33ec606292d92eff5afad6f50e1acc7109729Chia-I Wu ret = (img) ? _eglLinkImage(img) : EGL_NO_IMAGE_KHR; 1961b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1962b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 1963b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg} 1964b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1965e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 1966d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDRMImageMESA(EGLDisplay dpy, EGLImage image, 1967b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLint *name, EGLint *handle, EGLint *stride) 1968b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg{ 1969b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 1970b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLImage *img = _eglLookupImage(image, disp); 1971b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGLDriver *drv; 1972b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg EGLBoolean ret; 1973b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 19746a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); 19756a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 1976b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 19776b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu assert(disp->Extensions.MESA_drm_image); 19786b2f1561ad66c358a5d6b7a5ed5eb8f550a3b098Chia-I Wu 1979b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg if (!img) 1980b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 1981b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1982b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg ret = drv->API.ExportDRMImageMESA(drv, disp, img, name, handle, stride); 1983b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 1984b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 1985b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg} 1986b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg 19876b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19886b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkestruct wl_display; 19896b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 1990e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 19916b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglBindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) 19926b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{ 19936b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGLDisplay *disp = _eglLockDisplay(dpy); 19946b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGLDriver *drv; 19956b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke EGLBoolean ret; 19966b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 19976a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 19986a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 19996b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 20006b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke assert(disp->Extensions.WL_bind_wayland_display); 20016b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 20026b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke if (!display) 20036b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 20046b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 20056b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke ret = drv->API.BindWaylandDisplayWL(drv, disp, display); 20066b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 20076b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke RETURN_EGL_EVAL(disp, ret); 20086b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke} 20096b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 2010e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 20116b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin FranzkeeglUnbindWaylandDisplayWL(EGLDisplay dpy, struct wl_display *display) 20126b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{ 20136b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGLDisplay *disp = _eglLockDisplay(dpy); 20146b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGLDriver *drv; 20156b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke EGLBoolean ret; 20166b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 20176a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 20186a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 20196b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 20206b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke assert(disp->Extensions.WL_bind_wayland_display); 20216b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 20226b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke if (!display) 20236b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 20246b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 20256b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke ret = drv->API.UnbindWaylandDisplayWL(drv, disp, display); 20266b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 20276b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke RETURN_EGL_EVAL(disp, ret); 20286b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke} 2029e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 2030e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 20318d29b5271a2e66fc78436be31ed6748ff006f0cbAnder Conselvan de OliveiraeglQueryWaylandBufferWL(EGLDisplay dpy, struct wl_resource *buffer, 2032e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg EGLint attribute, EGLint *value) 2033e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg{ 2034e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg _EGLDisplay *disp = _eglLockDisplay(dpy); 2035e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg _EGLDriver *drv; 2036e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg EGLBoolean ret; 2037e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 20386a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 20396a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2040e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 2041e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg assert(disp->Extensions.WL_bind_wayland_display); 2042e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 2043e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg if (!buffer) 2044e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 2045e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 2046e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg ret = drv->API.QueryWaylandBufferWL(drv, disp, buffer, attribute, value); 2047e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg 2048e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg RETURN_EGL_EVAL(disp, ret); 2049e6a33570b73aa56c87818d7f67a122d4427b7841Kristian Høgsberg} 20507d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 2051720125ff99a8563d1f5991bd7428b8d884f1f618Emil Velikov 2052e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic struct wl_buffer * EGLAPIENTRY 2053d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglCreateWaylandBufferFromImageWL(EGLDisplay dpy, EGLImage image) 20545cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts{ 20555cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts _EGLDisplay *disp = _eglLockDisplay(dpy); 20565cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts _EGLImage *img; 20575cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts _EGLDriver *drv; 20585cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts struct wl_buffer *ret; 20595cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 20606a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_DISPLAY_KHR, NULL, EGL_FALSE); 20616a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 20625cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts _EGL_CHECK_DISPLAY(disp, NULL, drv); 20635cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts assert(disp->Extensions.WL_create_wayland_buffer_from_image); 20645cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 20655cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts img = _eglLookupImage(image, disp); 20665cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 20675cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts if (!img) 20685cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, NULL); 20695cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 20705cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts ret = drv->API.CreateWaylandBufferFromImageWL(drv, disp, img); 20715cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts 20725cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts RETURN_EGL_EVAL(disp, ret); 20735cddb1ce3c9890435374ae3e03fc4a5b57dee314Neil Roberts} 20747d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 2075e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 20767d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik HöglundeglPostSubBufferNV(EGLDisplay dpy, EGLSurface surface, 20777d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund EGLint x, EGLint y, EGLint width, EGLint height) 20787d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund{ 20797d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGLDisplay *disp = _eglLockDisplay(dpy); 20807d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGLSurface *surf = _eglLookupSurface(surface, disp); 20817d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGLDriver *drv; 20827d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund EGLBoolean ret; 20837d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 20846a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 20856a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 20867d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 20877d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 20887d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund if (!disp->Extensions.NV_post_sub_buffer) 20897d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund RETURN_EGL_EVAL(disp, EGL_FALSE); 20907d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 20917d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund ret = drv->API.PostSubBufferNV(drv, disp, surf, x, y, width, height); 20927d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 20937d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund RETURN_EGL_EVAL(disp, ret); 20947d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund} 2095c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 2096e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 2097c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah SharpeglGetSyncValuesCHROMIUM(EGLDisplay display, EGLSurface surface, 2098c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp EGLuint64KHR *ust, EGLuint64KHR *msc, 2099c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp EGLuint64KHR *sbc) 2100c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp{ 2101c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp _EGLDisplay *disp = _eglLockDisplay(display); 2102c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp _EGLSurface *surf = _eglLookupSurface(surface, disp); 2103c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp _EGLDriver *drv; 2104c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp EGLBoolean ret; 2105c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 21066a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_SURFACE_KHR, surf, EGL_FALSE); 21076a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2108c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); 2109c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp if (!disp->Extensions.CHROMIUM_sync_control) 2110c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp RETURN_EGL_EVAL(disp, EGL_FALSE); 2111c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 2112c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp if (!ust || !msc || !sbc) 2113c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 2114c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 2115c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp ret = drv->API.GetSyncValuesCHROMIUM(disp, surf, ust, msc, sbc); 2116c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp 2117c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp RETURN_EGL_EVAL(disp, ret); 2118c524f3ef9155caba6cd4f9fc72485426b1da76fdSarah Sharp} 21198f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 2120e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 2121d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDMABUFImageQueryMESA(EGLDisplay dpy, EGLImage image, 21228f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie EGLint *fourcc, EGLint *nplanes, 2123b5045e29917a783be74becee5e72566e2b0e3535Dave Airlie EGLuint64KHR *modifiers) 21248f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie{ 21258f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLDisplay *disp = _eglLockDisplay(dpy); 21268f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLImage *img = _eglLookupImage(image, disp); 21278f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLDriver *drv; 21288f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie EGLBoolean ret; 21298f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 21306a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); 21316a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 21328f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 21338f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie assert(disp->Extensions.MESA_image_dma_buf_export); 21348f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 21358f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie if (!img) 21368f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 21378f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 21388f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie ret = drv->API.ExportDMABUFImageQueryMESA(drv, disp, img, fourcc, nplanes, 21398f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie modifiers); 21408f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 21418f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie RETURN_EGL_EVAL(disp, ret); 21428f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie} 21438f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 2144e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikovstatic EGLBoolean EGLAPIENTRY 2145d333d30632516b1fc5b60181c2c237653e55a8e1Marek OlšákeglExportDMABUFImageMESA(EGLDisplay dpy, EGLImage image, 21468f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie int *fds, EGLint *strides, EGLint *offsets) 21478f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie{ 21488f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLDisplay *disp = _eglLockDisplay(dpy); 21498f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLImage *img = _eglLookupImage(image, disp); 21508f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGLDriver *drv; 21518f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie EGLBoolean ret; 21528f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 21536a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(disp, EGL_OBJECT_IMAGE_KHR, img, EGL_FALSE); 21546a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 21558f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie _EGL_CHECK_DISPLAY(disp, EGL_FALSE, drv); 21568f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie assert(disp->Extensions.MESA_image_dma_buf_export); 21578f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 21588f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie if (!img) 21598f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_FALSE); 21608f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 21618f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie ret = drv->API.ExportDMABUFImageMESA(drv, disp, img, fds, strides, offsets); 21628f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie 21638f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie RETURN_EGL_EVAL(disp, ret); 21648f7338f284cdb1fef64c85e3293d2200d0cc6387Dave Airlie} 2165e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov 2166ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLint EGLAPIENTRY 2167ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglLabelObjectKHR(EGLDisplay dpy, EGLenum objectType, EGLObjectKHR object, 2168ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman EGLLabelKHR label) 2169ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{ 2170ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGLDisplay *disp = NULL; 2171ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGLResourceType type; 2172ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2173ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC); 2174ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2175ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (objectType == EGL_OBJECT_THREAD_KHR) { 2176ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGLThreadInfo *t = _eglGetCurrentThread(); 2177ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2178ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (!_eglIsCurrentThreadDummy()) { 2179ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman t->Label = label; 2180ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_SUCCESS; 2181ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2182ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2183ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, EGL_BAD_ALLOC); 2184ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2185ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2186ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman disp = _eglLockDisplay(dpy); 2187ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (disp == NULL) 2188ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_DISPLAY, EGL_BAD_DISPLAY); 2189ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2190ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (objectType == EGL_OBJECT_DISPLAY_KHR) { 2191ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (dpy != (EGLDisplay) object) 2192ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER); 2193ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2194ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman disp->Label = label; 2195ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_EVAL(disp, EGL_SUCCESS); 2196ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2197ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2198ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman switch (objectType) { 2199ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_CONTEXT_KHR: 2200ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman type = _EGL_RESOURCE_CONTEXT; 2201ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2202ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_SURFACE_KHR: 2203ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman type = _EGL_RESOURCE_SURFACE; 2204ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2205ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_IMAGE_KHR: 2206ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman type = _EGL_RESOURCE_IMAGE; 2207ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2208ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_SYNC_KHR: 2209ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman type = _EGL_RESOURCE_SYNC; 2210ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2211ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman case EGL_OBJECT_STREAM_KHR: 2212ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman default: 2213ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER); 2214ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2215ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2216ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (_eglCheckResource(object, type, disp)) { 2217ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGLResource *res = (_EGLResource *) object; 2218ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2219ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman res->Label = label; 2220ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_EVAL(disp, EGL_SUCCESS); 2221ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2222ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2223ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman RETURN_EGL_ERROR(disp, EGL_BAD_PARAMETER, EGL_BAD_PARAMETER); 2224ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman} 2225ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2226ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLBoolean 22274729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom_validDebugMessageLevel(EGLAttrib level) 2228ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{ 2229ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return (level >= EGL_DEBUG_MSG_CRITICAL_KHR && 2230ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman level <= EGL_DEBUG_MSG_INFO_KHR); 2231ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman} 2232ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2233ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLint EGLAPIENTRY 2234ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglDebugMessageControlKHR(EGLDEBUGPROCKHR callback, 2235ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman const EGLAttrib *attrib_list) 2236ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{ 2237ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman unsigned int newEnabled; 2238ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2239ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC); 2240ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2241ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_lock(_eglGlobal.Mutex); 2242ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2243ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman newEnabled = _eglGlobal.debugTypesEnabled; 2244ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (attrib_list != NULL) { 2245ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman int i; 2246ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2247ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman for (i = 0; attrib_list[i] != EGL_NONE; i += 2) { 22484729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom if (_validDebugMessageLevel(attrib_list[i])) { 2249ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (attrib_list[i + 1]) 2250ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman newEnabled |= DebugBitFromType(attrib_list[i]); 2251ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman else 2252ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman newEnabled &= ~DebugBitFromType(attrib_list[i]); 2253ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman continue; 2254ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2255ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2256ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman // On error, set the last error code, call the current 2257ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman // debug callback, and return the error code. 2258ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_unlock(_eglGlobal.Mutex); 2259ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglReportError(EGL_BAD_ATTRIBUTE, NULL, 2260ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman "Invalid attribute 0x%04lx", (unsigned long) attrib_list[i]); 2261ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_BAD_ATTRIBUTE; 2262ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2263ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2264ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2265ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (callback != NULL) { 2266ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglGlobal.debugCallback = callback; 2267ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglGlobal.debugTypesEnabled = newEnabled; 2268ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } else { 2269ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglGlobal.debugCallback = NULL; 2270ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglGlobal.debugTypesEnabled = _EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR; 2271ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2272ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2273ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_unlock(_eglGlobal.Mutex); 2274ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_SUCCESS; 2275ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman} 2276ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2277ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brennemanstatic EGLBoolean EGLAPIENTRY 2278ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle BrennemaneglQueryDebugKHR(EGLint attribute, EGLAttrib *value) 2279ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman{ 2280ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, EGL_BAD_ALLOC); 2281ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2282ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_lock(_eglGlobal.Mutex); 2283ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2284ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman do { 22854729e1b511cf9411d4e2dfb6fba488f874d57acdEric Engestrom if (_validDebugMessageLevel(attribute)) { 2286ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (_eglGlobal.debugTypesEnabled & DebugBitFromType(attribute)) 2287ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman *value = EGL_TRUE; 2288ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman else 2289ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman *value = EGL_FALSE; 2290ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2291ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2292ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2293ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman if (attribute == EGL_DEBUG_CALLBACK_KHR) { 2294ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman *value = (EGLAttrib) _eglGlobal.debugCallback; 2295ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman break; 2296ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } 2297ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2298ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_unlock(_eglGlobal.Mutex); 2299ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman _eglReportError(EGL_BAD_ATTRIBUTE, NULL, 2300ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman "Invalid attribute 0x%04lx", (unsigned long) attribute); 2301ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_FALSE; 2302ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman } while (0); 2303ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2304ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman mtx_unlock(_eglGlobal.Mutex); 2305ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman return EGL_TRUE; 2306ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman} 2307ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman 2308e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov__eglMustCastToProperFunctionPointerType EGLAPIENTRY 2309e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil VelikoveglGetProcAddress(const char *procname) 2310e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov{ 2311e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov static const struct { 2312e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov const char *name; 2313e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov _EGLProc function; 2314e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov } egl_functions[] = { 2315448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov /* core functions queryable in the presence of 2316448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov * EGL_KHR_get_all_proc_addresses or EGL 1.5 2317448e01b2918c76dfff8abfbd56a606fdff8c356cEmil Velikov */ 2318e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov /* alphabetical order */ 2319e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglBindAPI", (_EGLProc) eglBindAPI }, 2320e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglBindTexImage", (_EGLProc) eglBindTexImage }, 2321e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglChooseConfig", (_EGLProc) eglChooseConfig }, 2322e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCopyBuffers", (_EGLProc) eglCopyBuffers }, 2323e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateContext", (_EGLProc) eglCreateContext }, 2324e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePbufferFromClientBuffer", (_EGLProc) eglCreatePbufferFromClientBuffer }, 2325e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePbufferSurface", (_EGLProc) eglCreatePbufferSurface }, 2326e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePixmapSurface", (_EGLProc) eglCreatePixmapSurface }, 2327e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateWindowSurface", (_EGLProc) eglCreateWindowSurface }, 2328e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglDestroyContext", (_EGLProc) eglDestroyContext }, 2329e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglDestroySurface", (_EGLProc) eglDestroySurface }, 2330e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetConfigAttrib", (_EGLProc) eglGetConfigAttrib }, 2331e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetConfigs", (_EGLProc) eglGetConfigs }, 2332e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetCurrentContext", (_EGLProc) eglGetCurrentContext }, 2333e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetCurrentDisplay", (_EGLProc) eglGetCurrentDisplay }, 2334e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetCurrentSurface", (_EGLProc) eglGetCurrentSurface }, 2335e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetDisplay", (_EGLProc) eglGetDisplay }, 2336e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetError", (_EGLProc) eglGetError }, 2337e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetProcAddress", (_EGLProc) eglGetProcAddress }, 2338e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglInitialize", (_EGLProc) eglInitialize }, 2339e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglMakeCurrent", (_EGLProc) eglMakeCurrent }, 2340e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQueryAPI", (_EGLProc) eglQueryAPI }, 2341e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQueryContext", (_EGLProc) eglQueryContext }, 2342e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQueryString", (_EGLProc) eglQueryString }, 2343e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQuerySurface", (_EGLProc) eglQuerySurface }, 2344e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglReleaseTexImage", (_EGLProc) eglReleaseTexImage }, 2345e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglReleaseThread", (_EGLProc) eglReleaseThread }, 2346e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSurfaceAttrib", (_EGLProc) eglSurfaceAttrib }, 2347e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSwapBuffers", (_EGLProc) eglSwapBuffers }, 2348e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSwapInterval", (_EGLProc) eglSwapInterval }, 2349e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglTerminate", (_EGLProc) eglTerminate }, 2350e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglWaitClient", (_EGLProc) eglWaitClient }, 2351e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglWaitGL", (_EGLProc) eglWaitGL }, 2352e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglWaitNative", (_EGLProc) eglWaitNative }, 23532885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglCreateSync", (_EGLProc) eglCreateSync }, 23542885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglDestroySync", (_EGLProc) eglDestroySync }, 23552885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglClientWaitSync", (_EGLProc) eglClientWaitSync }, 23561e79e054e7dff0c45538fff1257e1f81a206d7c9Marek Olšák { "eglGetSyncAttrib", (_EGLProc) eglGetSyncAttrib }, 23577524592da6305d52e95d718691d5a6665738aadeMarek Olšák { "eglWaitSync", (_EGLProc) eglWaitSync }, 2358515f04ed6fe0c914b2cd22c7ea65db6e34c362e3Marek Olšák { "eglCreateImage", (_EGLProc) eglCreateImage }, 23592885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglDestroyImage", (_EGLProc) eglDestroyImage }, 2360820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák { "eglGetPlatformDisplay", (_EGLProc) eglGetPlatformDisplay }, 2361820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák { "eglCreatePlatformWindowSurface", (_EGLProc) eglCreatePlatformWindowSurface }, 2362820a4d402ad3891ec460882feab3801fbc646a65Marek Olšák { "eglCreatePlatformPixmapSurface", (_EGLProc) eglCreatePlatformPixmapSurface }, 2363e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateImageKHR", (_EGLProc) eglCreateImageKHR }, 23642885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglDestroyImageKHR", (_EGLProc) eglDestroyImage }, 2365e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateSyncKHR", (_EGLProc) eglCreateSyncKHR }, 236651c8c66e1d81d03f0db6aee0a510aa85c277053eMarek Olšák { "eglCreateSync64KHR", (_EGLProc) eglCreateSync64KHR }, 23672885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglDestroySyncKHR", (_EGLProc) eglDestroySync }, 23682885ba0e4cea102d77832e2af4b212d00ab5edd4Marek Olšák { "eglClientWaitSyncKHR", (_EGLProc) eglClientWaitSync }, 2369e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglWaitSyncKHR", (_EGLProc) eglWaitSyncKHR }, 2370e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSignalSyncKHR", (_EGLProc) eglSignalSyncKHR }, 2371e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetSyncAttribKHR", (_EGLProc) eglGetSyncAttribKHR }, 2372e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSwapBuffersRegionNOK", (_EGLProc) eglSwapBuffersRegionNOK }, 2373e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateDRMImageMESA", (_EGLProc) eglCreateDRMImageMESA }, 2374e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglExportDRMImageMESA", (_EGLProc) eglExportDRMImageMESA }, 2375e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglBindWaylandDisplayWL", (_EGLProc) eglBindWaylandDisplayWL }, 2376e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglUnbindWaylandDisplayWL", (_EGLProc) eglUnbindWaylandDisplayWL }, 2377e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglQueryWaylandBufferWL", (_EGLProc) eglQueryWaylandBufferWL }, 2378e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreateWaylandBufferFromImageWL", (_EGLProc) eglCreateWaylandBufferFromImageWL }, 2379e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglPostSubBufferNV", (_EGLProc) eglPostSubBufferNV }, 2380e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglSwapBuffersWithDamageEXT", (_EGLProc) eglSwapBuffersWithDamageEXT }, 23810a606a400fe382a9bc726beef269b47f4485d85fEric Engestrom { "eglSwapBuffersWithDamageKHR", (_EGLProc) eglSwapBuffersWithDamageKHR }, 2382e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetPlatformDisplayEXT", (_EGLProc) eglGetPlatformDisplayEXT }, 2383e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePlatformWindowSurfaceEXT", (_EGLProc) eglCreatePlatformWindowSurfaceEXT }, 2384e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglCreatePlatformPixmapSurfaceEXT", (_EGLProc) eglCreatePlatformPixmapSurfaceEXT }, 2385e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglGetSyncValuesCHROMIUM", (_EGLProc) eglGetSyncValuesCHROMIUM }, 2386e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglExportDMABUFImageQueryMESA", (_EGLProc) eglExportDMABUFImageQueryMESA }, 2387e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { "eglExportDMABUFImageMESA", (_EGLProc) eglExportDMABUFImageMESA }, 2388ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman { "eglLabelObjectKHR", (_EGLProc) eglLabelObjectKHR }, 2389ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman { "eglDebugMessageControlKHR", (_EGLProc) eglDebugMessageControlKHR }, 2390ca9f26ac6fcb0afb68101fb3f74fcb3100507c0cKyle Brenneman { "eglQueryDebugKHR", (_EGLProc) eglQueryDebugKHR }, 23910201f01dc4e903d9b60cbbf87fde3ffa7c76f248Rob Clark { "eglDupNativeFenceFDANDROID", (_EGLProc) eglDupNativeFenceFDANDROID }, 2392e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov { NULL, NULL } 2393e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov }; 2394e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov EGLint i; 2395e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov _EGLProc ret; 2396e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov 2397e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov if (!procname) 2398e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov RETURN_EGL_SUCCESS(NULL, NULL); 2399e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov 24006a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman _EGL_FUNC_START(NULL, EGL_NONE, NULL, NULL); 24016a5545d3ba60a19a3bce8f62141e0991a595eeafKyle Brenneman 2402e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov ret = NULL; 2403e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov if (strncmp(procname, "egl", 3) == 0) { 2404e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov for (i = 0; egl_functions[i].name; i++) { 2405e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov if (strcmp(egl_functions[i].name, procname) == 0) { 2406e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov ret = egl_functions[i].function; 2407e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov break; 2408e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov } 2409e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov } 2410e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov } 2411e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov if (!ret) 2412e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov ret = _eglGetDriverProc(procname); 2413e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov 2414e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov RETURN_EGL_SUCCESS(NULL, ret); 2415e3cc5ad49d2f3f08c29d0b64d1c0c52560789d93Emil Velikov} 2416b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2417b6eda708431b91a3b568da0efac845c08cb36796Marek Olšákstatic int 2418b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák_eglLockDisplayInterop(EGLDisplay dpy, EGLContext context, 2419b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDisplay **disp, _EGLDriver **drv, 2420b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLContext **ctx) 2421b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{ 2422b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2423b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák *disp = _eglLockDisplay(dpy); 2424b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (!*disp || !(*disp)->Initialized || !(*disp)->Driver) { 2425b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (*disp) 2426b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _eglUnlockDisplay(*disp); 2427b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return MESA_GLINTEROP_INVALID_DISPLAY; 2428b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák } 2429b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2430b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák *drv = (*disp)->Driver; 2431b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2432b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák *ctx = _eglLookupContext(context, *disp); 2433b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (!*ctx || 2434b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ((*ctx)->ClientAPI != EGL_OPENGL_API && 2435b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák (*ctx)->ClientAPI != EGL_OPENGL_ES_API)) { 2436b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _eglUnlockDisplay(*disp); 2437b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return MESA_GLINTEROP_INVALID_CONTEXT; 2438b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák } 2439b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2440b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return MESA_GLINTEROP_SUCCESS; 2441b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák} 2442b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2443ee39d4456e7551b257343551d59e7c6a3388fdc0Marek OlšákPUBLIC int 2444b6eda708431b91a3b568da0efac845c08cb36796Marek OlšákMesaGLInteropEGLQueryDeviceInfo(EGLDisplay dpy, EGLContext context, 244513faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov struct mesa_glinterop_device_info *out) 2446b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{ 2447b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDisplay *disp; 2448b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDriver *drv; 2449b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLContext *ctx; 2450b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák int ret; 2451b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2452b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx); 2453b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (ret != MESA_GLINTEROP_SUCCESS) 2454b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return ret; 2455b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2456b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (drv->API.GLInteropQueryDeviceInfo) 2457b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = drv->API.GLInteropQueryDeviceInfo(disp, ctx, out); 2458b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák else 2459b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = MESA_GLINTEROP_UNSUPPORTED; 2460b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2461b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _eglUnlockDisplay(disp); 2462b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return ret; 2463b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák} 2464b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2465ee39d4456e7551b257343551d59e7c6a3388fdc0Marek OlšákPUBLIC int 2466b6eda708431b91a3b568da0efac845c08cb36796Marek OlšákMesaGLInteropEGLExportObject(EGLDisplay dpy, EGLContext context, 246713faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov struct mesa_glinterop_export_in *in, 246813faddb6b8e30ff0e81e62fb863304a57c712aaeEmil Velikov struct mesa_glinterop_export_out *out) 2469b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák{ 2470b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDisplay *disp; 2471b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLDriver *drv; 2472b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _EGLContext *ctx; 2473b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák int ret; 2474b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2475b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = _eglLockDisplayInterop(dpy, context, &disp, &drv, &ctx); 2476b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (ret != MESA_GLINTEROP_SUCCESS) 2477b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return ret; 2478b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2479b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák if (drv->API.GLInteropExportObject) 2480b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = drv->API.GLInteropExportObject(disp, ctx, in, out); 2481b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák else 2482b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák ret = MESA_GLINTEROP_UNSUPPORTED; 2483b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák 2484b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák _eglUnlockDisplay(disp); 2485b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák return ret; 2486b6eda708431b91a3b568da0efac845c08cb36796Marek Olšák} 2487