egl: clean up prototype code, new _eglFindAPIs() function.
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 19 Jun 2008 22:06:56 +0000 (16:06 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 19 Jun 2008 22:26:20 +0000 (16:26 -0600)
src/egl/main/eglcontext.c
src/egl/main/egldriver.c
src/egl/main/egldriver.h
src/egl/main/eglmisc.c

index bf1addf241b53be63d2a436a40df2a1c968f3d36..15847ef2da67191ad420be6e297dbd5fdf9a031e 100644 (file)
@@ -33,6 +33,8 @@ _eglInitContext(_EGLDriver *drv, EGLDisplay dpy, _EGLContext *ctx,
       return EGL_FALSE;
    }
 
+   ctx->ClientVersion = 1; /* the default, per EGL spec */
+
    for (i = 0; attrib_list && attrib_list[i] != EGL_NONE; i++) {
       switch (attrib_list[i]) {
       case EGL_CONTEXT_CLIENT_VERSION:
index 4a611b9fc971ee153f19a8b1a03a4b6e60d4acbd..edf85abe0120a79c401bd0fe6b8441ce1a1944d7 100644 (file)
@@ -35,6 +35,44 @@ static const char *SysFS = "/sys/class";
 
 
 
+/**
+ * Wrappers for dlopen/dlclose()
+ */
+#if defined(_EGL_PLATFORM_WINDOWS)
+
+   typedef HMODULE lib_handle;
+
+   static HMODULE
+   open_library(const char *filename)
+   {
+      return LoadLibrary(filename);
+   }
+
+   static void
+   close_library(HMODULE lib)
+   {
+      FreeLibrary(lib);
+   }
+   
+#elif defined(_EGL_PLATFORM_X)
+
+   typedef void * lib_handle;
+
+   static void *
+   open_library(const char *filename)
+   {
+      return dlopen(filename, RTLD_LAZY);
+   }
+
+   static void
+   close_library(void *lib)
+   {
+      dlclose(lib);
+   }
+   
+#endif
+
+
 
 /**
  * Given a card number, use sysfs to determine the DRI driver name.
@@ -165,11 +203,7 @@ _eglOpenDriver(_EGLDisplay *dpy, const char *driverName, const char *args)
 {
    _EGLDriver *drv;
    _EGLMain_t mainFunc;
-#if defined(_EGL_PLATFORM_WINDOWS)
-   HMODULE lib;
-#elif defined(_EGL_PLATFORM_X)
-   void *lib;
-#endif
+   lib_handle lib;
    char driverFilename[1000];
 
    assert(driverName);
@@ -178,13 +212,12 @@ _eglOpenDriver(_EGLDisplay *dpy, const char *driverName, const char *args)
    /* XXX untested */
    sprintf(driverFilename, "%s.dll", driverName);
    _eglLog(_EGL_DEBUG, "dlopen(%s)", driverFilename);
-   lib = LoadLibrary(driverFilename);
 #elif defined(_EGL_PLATFORM_X)
    /* XXX also prepend a directory path??? */
    sprintf(driverFilename, "%s.so", driverName);
    _eglLog(_EGL_DEBUG, "dlopen(%s)", driverFilename);
-   lib = dlopen(driverFilename, RTLD_LAZY);
 #endif
+   lib = open_library(driverFilename);
 
    if (!lib) {
       _eglLog(_EGL_WARNING, "Could not open %s (%s)",
@@ -200,21 +233,13 @@ _eglOpenDriver(_EGLDisplay *dpy, const char *driverName, const char *args)
 
    if (!mainFunc) {
       _eglLog(_EGL_WARNING, "_eglMain not found in %s", driverFilename);
-#if defined(_EGL_PLATFORM_WINDOWS)
-      FreeLibrary(lib);
-#elif defined(_EGL_PLATFORM_X)
-      dlclose(lib);
-#endif
+      close_library(lib);
       return NULL;
    }
 
    drv = mainFunc(dpy, args);
    if (!drv) {
-#if defined(_EGL_PLATFORM_WINDOWS)
-      FreeLibrary(lib);
-#elif defined(_EGL_PLATFORM_X)
-      dlclose(lib);
-#endif
+      close_library(lib);
       return NULL;
    }
 
@@ -223,11 +248,7 @@ _eglOpenDriver(_EGLDisplay *dpy, const char *driverName, const char *args)
       drv->LibHandle = lib;
    }
    else {
-#if defined(_EGL_PLATFORM_WINDOWS)
-      FreeLibrary(lib);
-#elif defined(_EGL_PLATFORM_X)
-      dlclose(lib);
-#endif
+      close_library(lib);
    }
 
    /* update the global notion of supported APIs */
@@ -253,11 +274,7 @@ _eglCloseDriver(_EGLDriver *drv, EGLDisplay dpy)
 
    b = drv->API.Terminate(drv, dpy);
 
-#if defined(_EGL_PLATFORM_WINDOWS)
-   FreeLibrary(handle);
-#elif defined(_EGL_PLATFORM_X)
-   dlclose(handle);
-#endif
+   close_library(handle);
 
    return b;
 }
@@ -343,3 +360,50 @@ _eglInitDriverFallbacks(_EGLDriver *drv)
    drv->API.CreatePbufferFromClientBuffer = _eglCreatePbufferFromClientBuffer;
 #endif /* EGL_VERSION_1_2 */
 }
+
+
+
+/**
+ * Try to determine which EGL APIs (OpenGL, OpenGL ES, OpenVG, etc)
+ * are supported on the system by looking for standard library names.
+ */
+EGLint
+_eglFindAPIs(void)
+{
+   EGLint mask = 0x0;
+   lib_handle lib;
+#if defined(_EGL_PLATFORM_WINDOWS)
+   /* XXX not sure about these names */
+   const char *es1_libname = "libGLESv1_CM.dll";
+   const char *es2_libname = "libGLESv2.dll";
+   const char *gl_libname = "OpenGL32.dll";
+   const char *vg_libname = "libOpenVG.dll";
+#elif defined(_EGL_PLATFORM_X)
+   const char *es1_libname = "libGLESv1_CM.so";
+   const char *es2_libname = "libGLESv2.so";
+   const char *gl_libname = "libGL.so";
+   const char *vg_libname = "libOpenVG.so";
+#endif
+
+   if ((lib = open_library(es1_libname))) {
+      close_library(lib);
+      mask |= EGL_OPENGL_ES_BIT;
+   }
+
+   if ((lib = open_library(es2_libname))) {
+      close_library(lib);
+      mask |= EGL_OPENGL_ES2_BIT;
+   }
+
+   if ((lib = open_library(gl_libname))) {
+      close_library(lib);
+      mask |= EGL_OPENGL_BIT;
+   }
+
+   if ((lib = open_library(vg_libname))) {
+      close_library(lib);
+      mask |= EGL_OPENVG_BIT;
+   }
+
+   return mask;
+}
index 1eae6f8034ceb5b16c8f458677c32ec151a23e61..7827ca3ae3d91b5059383b9646f8cecac409fb96 100644 (file)
@@ -72,4 +72,8 @@ extern void
 _eglInitDriverFallbacks(_EGLDriver *drv);
 
 
+extern EGLint
+_eglFindAPIs(void);
+
+
 #endif /* EGLDRIVER_INCLUDED */
index e79223657dc093cd55c8ae4891685c04b28c8a63..b5bdc3ea4bfe48fc181ab68110dae12967930471 100644 (file)
@@ -54,58 +54,6 @@ _eglUpdateExtensionsString(_EGLDriver *drv)
 }
 
 
-#if 0 /* prototype code */
-
-#include <dlfcn.h>
-
-static EGLint
-_eglFindAPIs_by_sym(void)
-{
-   EGLint mask = 0x0;
-   
-   if (dlsym(NULL, "glBegin"))
-      mask |= EGL_OPENGL_BIT;
-   if (dlsym(NULL, "glGetFixedv"))
-      mask |= EGL_OPENGL_ES_BIT;
-   if (dlsym(NULL, "vgSetf"))
-      mask |= EGL_OPENVG_BIT;
-
-   return mask;
-}
-
-static EGLint
-_eglFindAPIs_by_lib(void)
-{
-   EGLint mask = 0x0;
-   int flag = RTLD_NOW;
-   void *h;
-
-   if ((h = dlopen("libGLESv1_CM.so", flag))) {
-      dlclose(h);
-      mask |= EGL_OPENGL_ES_BIT;
-   }
-
-   if ((h = dlopen("libGLESv2.so", flag))) {
-      dlclose(h);
-      mask |= EGL_OPENGL_ES2_BIT;
-   }
-
-   if ((h = dlopen("libGL.so", flag))) {
-      dlclose(h);
-      mask |= EGL_OPENGL_BIT;
-   }
-
-   if ((h = dlopen("libOpenVG.so", flag))) {
-      dlclose(h);
-      mask |= EGL_OPENVG_BIT;
-   }
-
-   return mask;
-}
-
-#endif
-
-
 static void
 _eglUpdateAPIsString(_EGLDriver *drv)
 {