111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul/************************************************************************** 2f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * 311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2009-2010 Chia-I Wu <olvaffe@gmail.com> 5f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * Copyright 2010-2011 LunarG, Inc. 611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * All Rights Reserved. 7f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * 811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * copy of this software and associated documentation files (the 1011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * "Software"), to deal in the Software without restriction, including 1111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * without limitation the rights to use, copy, modify, merge, publish, 1211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * distribute, sub license, and/or sell copies of the Software, and to 1311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * permit persons to whom the Software is furnished to do so, subject to 1411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * the following conditions: 15f2001df508fda599a18b3586d2775e970a3db13aChia-I Wu * 1611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * The above copyright notice and this permission notice (including the 1711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * next paragraph) shall be included in all copies or substantial portions 1811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * 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 * 2811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul **************************************************************************/ 2911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 3011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 3111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul/** 3211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * Small/misc EGL functions 3311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul */ 3411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 3511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 3611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul#include <assert.h> 3711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul#include <string.h> 3894cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h" 3911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul#include "eglmisc.h" 405a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu#include "egldisplay.h" 41a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu#include "egldriver.h" 42a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu#include "eglstring.h" 4311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 4411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 4511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul/** 460135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu * Copy the extension into the string and update the string pointer. 470135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu */ 480135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wustatic EGLint 490135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu_eglAppendExtension(char **str, const char *ext) 500135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu{ 510135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu char *s = *str; 521e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu size_t len = strlen(ext); 530135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu 540135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu if (s) { 550135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu memcpy(s, ext, len); 560135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu s[len++] = ' '; 570135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu s[len] = '\0'; 580135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu 590135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu *str += len; 600135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu } 610135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu else { 620135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu len++; 630135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu } 640135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu 651e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu return (EGLint) len; 660135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu} 670135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu 680135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu 690135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu/** 7011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * Examine the individual extension enable/disable flags and recompute 7111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * the driver's Extensions string. 7211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul */ 7311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paulstatic void 745a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu_eglUpdateExtensionsString(_EGLDisplay *dpy) 7511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul{ 760135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu#define _EGL_CHECK_EXTENSION(ext) \ 770135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu do { \ 780135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu if (dpy->Extensions.ext) { \ 790135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _eglAppendExtension(&exts, "EGL_" #ext); \ 80a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu assert(exts <= dpy->ExtensionsString + _EGL_MAX_EXTENSIONS_LEN); \ 810135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu } \ 820135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu } while (0) 830135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu 84a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu char *exts = dpy->ExtensionsString; 8511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 865a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu if (exts[0]) 875a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu return; 885a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu 890135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(MESA_screen_surface); 900135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(MESA_copy_context); 9178d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu _EGL_CHECK_EXTENSION(MESA_drm_display); 92b7a8893a2413adfddf4dc836676a19463fb6ffd7Kristian Høgsberg _EGL_CHECK_EXTENSION(MESA_drm_image); 93a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 946b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke _EGL_CHECK_EXTENSION(WL_bind_wayland_display); 956b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke 960135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(KHR_image_base); 970135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(KHR_image_pixmap); 98a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu if (dpy->Extensions.KHR_image_base && dpy->Extensions.KHR_image_pixmap) 990135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _eglAppendExtension(&exts, "EGL_KHR_image"); 1000135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu 1010135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(KHR_vg_parent_image); 1020135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(KHR_gl_texture_2D_image); 1030135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(KHR_gl_texture_cubemap_image); 1040135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(KHR_gl_texture_3D_image); 1050135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu _EGL_CHECK_EXTENSION(KHR_gl_renderbuffer_image); 106a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu 1074eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu _EGL_CHECK_EXTENSION(KHR_reusable_sync); 1082b2c5c4f5cb4620044eeaa7cc308e696209c7046Chia-I Wu _EGL_CHECK_EXTENSION(KHR_fence_sync); 1094eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu 110b50703aea55450e04bcd8154335774786e0f253bIan Romanick _EGL_CHECK_EXTENSION(KHR_surfaceless_context); 11163beb3df98147f34fd0965cb0afbb97444206d0cIan Romanick _EGL_CHECK_EXTENSION(KHR_create_context); 112b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg 11352c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg _EGL_CHECK_EXTENSION(NOK_swap_region); 1145dc0f49084f322dd8ff6eb585212eea8b50e3377Kristian Høgsberg _EGL_CHECK_EXTENSION(NOK_texture_from_pixmap); 11500b365bc78c131bfd1c19bb22ac55e36f4e8f3c5Chia-I Wu 11600b365bc78c131bfd1c19bb22ac55e36f4e8f3c5Chia-I Wu _EGL_CHECK_EXTENSION(ANDROID_image_native_buffer); 1177d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund 118f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick _EGL_CHECK_EXTENSION(EXT_create_context_robustness); 119f171571bfc897921cee63cbba3b71fd9b64174c9Ian Romanick 1207d46b45c5bd7d1ab3e32a2722ca65061ca80dc34Fredrik Höglund _EGL_CHECK_EXTENSION(NV_post_sub_buffer); 1210135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu#undef _EGL_CHECK_EXTENSION 12211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul} 12311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 12411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 125d5078b94323241a6482f54797756116b1c864327Brian Paulstatic void 1265a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu_eglUpdateAPIsString(_EGLDisplay *dpy) 127d5078b94323241a6482f54797756116b1c864327Brian Paul{ 128a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu char *apis = dpy->ClientAPIsString; 129d5078b94323241a6482f54797756116b1c864327Brian Paul 130a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu if (apis[0] || !dpy->ClientAPIs) 1315a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu return; 132d5078b94323241a6482f54797756116b1c864327Brian Paul 133a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu if (dpy->ClientAPIs & EGL_OPENGL_BIT) 1345a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu strcat(apis, "OpenGL "); 135d5078b94323241a6482f54797756116b1c864327Brian Paul 136a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu if (dpy->ClientAPIs & EGL_OPENGL_ES_BIT) 1375a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu strcat(apis, "OpenGL_ES "); 138d5078b94323241a6482f54797756116b1c864327Brian Paul 139a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu if (dpy->ClientAPIs & EGL_OPENGL_ES2_BIT) 1405a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu strcat(apis, "OpenGL_ES2 "); 141d5078b94323241a6482f54797756116b1c864327Brian Paul 142a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu if (dpy->ClientAPIs & EGL_OPENVG_BIT) 1435a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu strcat(apis, "OpenVG "); 144d5078b94323241a6482f54797756116b1c864327Brian Paul 14536a59b29ef07b78378dcb3934131d262d42612cbChia-I Wu assert(strlen(apis) < sizeof(dpy->ClientAPIsString)); 1465a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu} 147d5078b94323241a6482f54797756116b1c864327Brian Paul 14811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul 14911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paulconst char * 1502f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglQueryString(_EGLDriver *drv, _EGLDisplay *dpy, EGLint name) 15111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul{ 15211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul (void) drv; 153a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu 15411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul switch (name) { 15511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul case EGL_VENDOR: 15611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul return _EGL_VENDOR_STRING; 15711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul case EGL_VERSION: 158a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu _eglsnprintf(dpy->VersionString, sizeof(dpy->VersionString), 159e7d8f925704ddd635748fe72a42eaeec95eb89eeChia-I Wu "%d.%d (%s)", dpy->VersionMajor, dpy->VersionMinor, 160a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu dpy->Driver->Name); 161a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu return dpy->VersionString; 16211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul case EGL_EXTENSIONS: 1635a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu _eglUpdateExtensionsString(dpy); 164a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu return dpy->ExtensionsString; 16511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul case EGL_CLIENT_APIS: 1665a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu _eglUpdateAPIsString(dpy); 167a4a38dcf61f141297a083ccac217200947d57b0dChia-I Wu return dpy->ClientAPIsString; 16811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul default: 16911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul _eglError(EGL_BAD_PARAMETER, "eglQueryString"); 17011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul return NULL; 17111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul } 17211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul} 173