egl: Allow binding to any client API.
authorChia-I Wu <olvaffe@gmail.com>
Mon, 17 Aug 2009 07:53:54 +0000 (15:53 +0800)
committerBrian Paul <brianp@vmware.com>
Tue, 13 Oct 2009 18:00:36 +0000 (12:00 -0600)
As a result, EGL_NONE is no longer a valid client API.  And it is
possible that no config supports the current bound API.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
src/egl/main/eglapi.c
src/egl/main/eglcurrent.c
src/egl/main/eglcurrent.h
src/egl/main/eglglobals.c
src/egl/main/eglglobals.h

index 23d841d2d1a397cba453e9caa9b2e45ca49dc10e..d86ef9ce562d278ae03a399a5722f5cfe6fbc58e 100644 (file)
@@ -92,8 +92,8 @@ eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
       snprintf(disp->Version, sizeof(disp->Version),
                "%d.%d (%s)", major_int, minor_int, drv->Name);
 
-      /* update the global notion of supported APIs */
-      _eglGlobal.ClientAPIsMask |= disp->ClientAPIsMask;
+      /* limit to APIs supported by core */
+      disp->ClientAPIsMask &= _EGL_API_ALL_BITS;
 
       disp->Driver = drv;
    } else {
@@ -842,33 +842,7 @@ eglBindAPI(EGLenum api)
    if (!_eglIsApiValid(api))
       return _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
 
-   switch (api) {
-#ifdef EGL_VERSION_1_4
-   case EGL_OPENGL_API:
-      if (_eglGlobal.ClientAPIsMask & EGL_OPENGL_BIT) {
-         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
-         return EGL_TRUE;
-      }
-      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
-      return EGL_FALSE;
-#endif
-   case EGL_OPENGL_ES_API:
-      if (_eglGlobal.ClientAPIsMask & (EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT)) {
-         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
-         return EGL_TRUE;
-      }
-      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
-      return EGL_FALSE;
-   case EGL_OPENVG_API:
-      if (_eglGlobal.ClientAPIsMask & EGL_OPENVG_BIT) {
-         t->CurrentAPIIndex = _eglConvertApiToIndex(api);
-         return EGL_TRUE;
-      }
-      _eglError(EGL_BAD_PARAMETER, "eglBindAPI");
-      return EGL_FALSE;
-   default:
-      return EGL_FALSE;
-   }
+   t->CurrentAPIIndex = _eglConvertApiToIndex(api);
    return EGL_TRUE;
 }
 
index 4431f964f69bce0e851b3bbb7d99d0a5ac261f3e..ca7a077168188f69545a9ba8cd4f6b06424b7299 100644 (file)
@@ -9,7 +9,7 @@
 
 /* This should be kept in sync with _eglInitThreadInfo() */
 #define _EGL_THREAD_INFO_INITIALIZER \
-   { EGL_SUCCESS, { NULL }, 1 }
+   { EGL_SUCCESS, { NULL }, 0 }
 
 /* a fallback thread info to guarantee that every thread always has one */
 static _EGLThreadInfo dummy_thread = _EGL_THREAD_INFO_INITIALIZER;
index 8eb241029eca096644bfa9d680fb749b7101ca04..9503e0aba0886d30f088be67dd687e6d7fa8365c 100644 (file)
@@ -4,8 +4,16 @@
 #include "egltypedefs.h"
 
 
-#define _EGL_API_NUM_INDICES \
-   (EGL_OPENGL_API - EGL_OPENGL_ES_API + 2) /* idx 0 is for EGL_NONE */
+#define _EGL_API_ALL_BITS \
+   (EGL_OPENGL_ES_BIT   | \
+    EGL_OPENVG_BIT      | \
+    EGL_OPENGL_ES2_BIT  | \
+    EGL_OPENGL_BIT)
+
+
+#define _EGL_API_FIRST_API EGL_OPENGL_ES_API
+#define _EGL_API_LAST_API EGL_OPENGL_API
+#define _EGL_API_NUM_APIS (_EGL_API_LAST_API - _EGL_API_FIRST_API + 1)
 
 
 /**
 struct _egl_thread_info
 {
    EGLint LastError;
-   _EGLContext *CurrentContexts[_EGL_API_NUM_INDICES];
+   _EGLContext *CurrentContexts[_EGL_API_NUM_APIS];
    /* use index for fast access to current context */
    EGLint CurrentAPIIndex;
 };
 
 
 /**
- * Return true if a client API enum can be converted to an index.
+ * Return true if a client API enum is recognized.
  */
 static INLINE EGLBoolean
 _eglIsApiValid(EGLenum api)
 {
-   return ((api >= EGL_OPENGL_ES_API && api <= EGL_OPENGL_API) ||
-           api == EGL_NONE);
+   return (api >= _EGL_API_FIRST_API && api <= _EGL_API_LAST_API);
 }
 
 
@@ -38,7 +45,7 @@ _eglIsApiValid(EGLenum api)
 static INLINE EGLint
 _eglConvertApiToIndex(EGLenum api)
 {
-   return (api != EGL_NONE) ? api - EGL_OPENGL_ES_API + 1 : 0;
+   return api - _EGL_API_FIRST_API;
 }
 
 
@@ -49,7 +56,7 @@ _eglConvertApiToIndex(EGLenum api)
 static INLINE EGLenum
 _eglConvertApiFromIndex(EGLint idx)
 {
-   return (idx) ? EGL_OPENGL_ES_API + idx - 1 : EGL_NONE;
+   return _EGL_API_FIRST_API + idx;
 }
 
 
index 3ae4c1ad3a3223a5814ab2f2a77159359319166e..30d9fe97b4e10bba380a15fa9d4d42999a9a4101 100644 (file)
@@ -15,7 +15,6 @@ struct _egl_global _eglGlobal =
    &_eglGlobalMutex,       /* Mutex */
    NULL,                   /* DisplayList */
    1,                      /* FreeScreenHandle */
-   0x0,                    /* ClientAPIsMask */
    0,                      /* NumDrivers */
    { NULL },               /* Drivers */
    2,                      /* NumAtExitCalls */
index 58511076d452b1315eaa3dde873536d492523af6..5ebb914ca723c97af8730e7dc0b99ad16f3a60d5 100644 (file)
@@ -19,9 +19,6 @@ struct _egl_global
 
    EGLScreenMESA FreeScreenHandle;
 
-   /* bitmaks of supported APIs (supported by _some_ driver) */
-   EGLint ClientAPIsMask;
-
    EGLint NumDrivers;
    _EGLDriver *Drivers[10];