eglmisc.c revision 4eebea74a81ec5fbacf2347ea88cac137ddd4d69
111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul/**************************************************************************
211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul *
311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * All Rights Reserved.
511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul *
611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * copy of this software and associated documentation files (the
811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * "Software"), to deal in the Software without restriction, including
911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * without limitation the rights to use, copy, modify, merge, publish,
1011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * distribute, sub license, and/or sell copies of the Software, and to
1111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * permit persons to whom the Software is furnished to do so, subject to
1211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * the following conditions:
1311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul *
1411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * The above copyright notice and this permission notice (including the
1511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * next paragraph) shall be included in all copies or substantial portions
1611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * of the Software.
1711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul *
1811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul *
2611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul **************************************************************************/
2711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
2811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
2911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul/**
3011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * Small/misc EGL functions
3111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul */
3211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
3311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
3411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul#include <assert.h>
3511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul#include <string.h>
3694cb321b5d246185abf71d89968d472a626f1a23Chia-I Wu#include "eglcurrent.h"
3711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul#include "eglmisc.h"
385a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu#include "egldisplay.h"
3911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
4011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
4111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul/**
420135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu * Copy the extension into the string and update the string pointer.
430135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu */
440135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wustatic EGLint
450135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu_eglAppendExtension(char **str, const char *ext)
460135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu{
470135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   char *s = *str;
481e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu   size_t len = strlen(ext);
490135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu
500135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   if (s) {
510135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      memcpy(s, ext, len);
520135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      s[len++] = ' ';
530135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      s[len] = '\0';
540135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu
550135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      *str += len;
560135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   }
570135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   else {
580135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      len++;
590135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   }
600135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu
611e6c10f4be9e36cc052a6b47fb2cb1eae60caa00Chia-I Wu   return (EGLint) len;
620135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu}
630135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu
640135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu
650135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu/**
6611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * Examine the individual extension enable/disable flags and recompute
6711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul * the driver's Extensions string.
6811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul */
6911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paulstatic void
705a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu_eglUpdateExtensionsString(_EGLDisplay *dpy)
7111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul{
720135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu#define _EGL_CHECK_EXTENSION(ext)                                          \
730135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   do {                                                                    \
740135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      if (dpy->Extensions.ext) {                                           \
750135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu         _eglAppendExtension(&exts, "EGL_" #ext);                          \
760135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu         assert(exts <= dpy->Extensions.String + _EGL_MAX_EXTENSIONS_LEN); \
770135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      }                                                                    \
780135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   } while (0)
790135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu
805a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   char *exts = dpy->Extensions.String;
8111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
825a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   if (exts[0])
835a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      return;
845a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu
850135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(MESA_screen_surface);
860135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(MESA_copy_context);
8778d70ddbbd41d73b7f6040f392eb87758c39dc37Chia-I Wu   _EGL_CHECK_EXTENSION(MESA_drm_display);
88a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
890135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(KHR_image_base);
900135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(KHR_image_pixmap);
91a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu   if (dpy->Extensions.KHR_image_base && dpy->Extensions.KHR_image_pixmap)
920135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu      _eglAppendExtension(&exts, "EGL_KHR_image");
930135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu
940135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(KHR_vg_parent_image);
950135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(KHR_gl_texture_2D_image);
960135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(KHR_gl_texture_cubemap_image);
970135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(KHR_gl_texture_3D_image);
980135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu   _EGL_CHECK_EXTENSION(KHR_gl_renderbuffer_image);
99a1c4a8a3c855d52fbfef10023b9a8f116e163a97Chia-I Wu
1004eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu   _EGL_CHECK_EXTENSION(KHR_reusable_sync);
1014eebea74a81ec5fbacf2347ea88cac137ddd4d69Chia-I Wu
102b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   _EGL_CHECK_EXTENSION(KHR_surfaceless_gles1);
103b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   _EGL_CHECK_EXTENSION(KHR_surfaceless_gles2);
104b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg   _EGL_CHECK_EXTENSION(KHR_surfaceless_opengl);
105b90a3e7d8b1bcd412ddbf2a4803de2756dacd436Kristian Høgsberg
10652c554a79d3ed3104a9f7d112faa9129073b5a25Kristian Høgsberg   _EGL_CHECK_EXTENSION(NOK_swap_region);
1075dc0f49084f322dd8ff6eb585212eea8b50e3377Kristian Høgsberg   _EGL_CHECK_EXTENSION(NOK_texture_from_pixmap);
1080135e5d6c83add5e539492a4899504e33f3f2434Chia-I Wu#undef _EGL_CHECK_EXTENSION
10911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul}
11011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
11111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
112d5078b94323241a6482f54797756116b1c864327Brian Paulstatic void
1135a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu_eglUpdateAPIsString(_EGLDisplay *dpy)
114d5078b94323241a6482f54797756116b1c864327Brian Paul{
1155a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   char *apis = dpy->ClientAPIs;
116d5078b94323241a6482f54797756116b1c864327Brian Paul
1175a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   if (apis[0] || !dpy->ClientAPIsMask)
1185a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      return;
119d5078b94323241a6482f54797756116b1c864327Brian Paul
1205a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   if (dpy->ClientAPIsMask & EGL_OPENGL_BIT)
1215a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      strcat(apis, "OpenGL ");
122d5078b94323241a6482f54797756116b1c864327Brian Paul
1235a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   if (dpy->ClientAPIsMask & EGL_OPENGL_ES_BIT)
1245a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      strcat(apis, "OpenGL_ES ");
125d5078b94323241a6482f54797756116b1c864327Brian Paul
1265a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   if (dpy->ClientAPIsMask & EGL_OPENGL_ES2_BIT)
1275a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      strcat(apis, "OpenGL_ES2 ");
128d5078b94323241a6482f54797756116b1c864327Brian Paul
1295a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   if (dpy->ClientAPIsMask & EGL_OPENVG_BIT)
1305a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      strcat(apis, "OpenVG ");
131d5078b94323241a6482f54797756116b1c864327Brian Paul
1325a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu   assert(strlen(apis) < sizeof(dpy->ClientAPIs));
1335a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu}
134d5078b94323241a6482f54797756116b1c864327Brian Paul
13511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
13611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paulconst char *
1372f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglQueryString(_EGLDriver *drv, _EGLDisplay *dpy, EGLint name)
13811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul{
13911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   (void) drv;
14011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   (void) dpy;
14111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   switch (name) {
14211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   case EGL_VENDOR:
14311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul      return _EGL_VENDOR_STRING;
14411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   case EGL_VERSION:
1455a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      return dpy->Version;
14611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   case EGL_EXTENSIONS:
1475a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      _eglUpdateExtensionsString(dpy);
1485a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      return dpy->Extensions.String;
14911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul#ifdef EGL_VERSION_1_2
15011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   case EGL_CLIENT_APIS:
1515a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      _eglUpdateAPIsString(dpy);
1525a2c9372a0d9fa1efd924f9386a4e3df47c17d0eChia-I Wu      return dpy->ClientAPIs;
15311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul#endif
15411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   default:
15511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul      _eglError(EGL_BAD_PARAMETER, "eglQueryString");
15611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul      return NULL;
15711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   }
15811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul}
15911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
16011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
16111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian PaulEGLBoolean
1626c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu_eglWaitClient(_EGLDriver *drv, _EGLDisplay *dpy, _EGLContext *ctx)
16311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul{
16411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   /* just a placeholder */
16511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   (void) drv;
16611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   (void) dpy;
1676c21c8862bc6edc9cddf3b6eb6f276961099a7a8Chia-I Wu   (void) ctx;
16811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   return EGL_TRUE;
16911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul}
17011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
17111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
17211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian PaulEGLBoolean
1732f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglWaitNative(_EGLDriver *drv, _EGLDisplay *dpy, EGLint engine)
17411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul{
17511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   /* just a placeholder */
17611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   (void) drv;
17711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   (void) dpy;
17811a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   switch (engine) {
17911a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   case EGL_CORE_NATIVE_ENGINE:
18011a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul      break;
18111a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   default:
18211a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul      _eglError(EGL_BAD_PARAMETER, "eglWaitNative(engine)");
18311a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul      return EGL_FALSE;
18411a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   }
18511a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul
18611a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul   return EGL_TRUE;
18711a261ef4f1d4100c46f73ad51e7e4ed57cc1b5eBrian Paul}
188