#include <dlfcn.h>
#include "eglx.h"
#elif defined(_EGL_PLATFORM_WINDOWS)
-/* XXX to do */
-#elif defined(_EGL_PLATFORM_WINCE)
-/* XXX to do */
+/* Use static linking on Windows for now */
+#define WINDOWS_STATIC_LINK
#endif
+/**
+ * Wrappers for dlopen/dlclose()
+ */
+#if defined(_EGL_PLATFORM_WINDOWS)
+#ifdef WINDOWS_STATIC_LINK
+ static const char *DefaultDriverName = "Windows EGL Static Library";
+#else
+ /* XXX Need to decide how to do dynamic name lookup on Windows */
+ static const char *DefaultDriverName = "TBD";
+#endif
+ static const char *SysFS = NULL;
+ typedef HMODULE lib_handle;
+
+ static HMODULE
+ open_library(const char *filename)
+ {
+#ifdef WINDOWS_STATIC_LINK
+ return 0;
+#else
+ return LoadLibrary(filename);
+#endif
+ }
+
+ static void
+ close_library(HMODULE lib)
+ {
+#ifdef WINDOWS_STATIC_LINK
+#else
+ FreeLibrary(lib);
+#endif
+ }
-static const char *DefaultDriverName = ":0";
-static const char *SysFS = "/sys/class";
+#elif defined(_EGL_PLATFORM_X)
+ static const char *DefaultDriverName = ":0";
+ static const char *SysFS = "/sys/class";
+ 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.
#endif
}
-
/**
* XXX this function is totally subject change!!!
*
const char *
_eglChooseDriver(_EGLDisplay *dpy)
{
+ /* Under Windows, the NativeDisplay is an HDC handle, therefore */
+ /* it can't be interpreted as a string or a pointer. */
+#if defined(_EGL_PLATFORM_WINDOWS)
+ const char *displayString = NULL;
+#else
const char *displayString = (const char *) dpy->NativeDisplay;
+#endif
const char *driverName = NULL;
(void) DefaultDriverName;
+#if defined(_EGL_PLATFORM_X)
/* First, if the EGL_DRIVER env var is set, use that */
driverName = getenv("EGL_DRIVER");
if (driverName)
return _eglstrdup(driverName);
+#endif
#if 0
if (!displayString) {
}
}
}
- else {
+ else
+ {
/* NativeDisplay is not a string! */
#if defined(_EGL_PLATFORM_X)
driverName = _xeglChooseDriver(dpy);
-#elif defined(_EGL_PLATFORM_WINDOWS)
- /* XXX to do */
- driverName = _weglChooseDriver(dpy);
-#elif defined(_EGL_PLATFORM_WINCE)
- /* XXX to do */
#else
driverName = DefaultDriverName;
#endif
{
_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);
#if defined(_EGL_PLATFORM_WINDOWS)
+/* Use static linking on Windows for now */
+#ifdef WINDOWS_STATIC_LINK
+ lib = 0;
+ mainFunc = (_EGLMain_t)_eglMain;
+#else
/* XXX untested */
sprintf(driverFilename, "%s.dll", driverName);
_eglLog(_EGL_DEBUG, "dlopen(%s)", driverFilename);
- lib = LoadLibrary(driverFilename);
+ lib = open_library(driverFilename);
+ if (!lib) {
+ _eglLog(_EGL_WARNING, "Could not open %s",
+ driverFilename);
+ return NULL;
+ }
+ mainFunc = (_EGLMain_t) GetProcAddress(lib, "_eglMain");
+#endif
#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)",
driverFilename, dlerror());
return NULL;
}
-
-#if defined(_EGL_PLATFORM_WINDOWS)
- mainFunc = (_EGLMain_t) GetProcAddress(lib, "_eglMain");
-#elif defined(_EGL_PLATFORM_X)
mainFunc = (_EGLMain_t) dlsym(lib, "_eglMain");
#endif
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;
}
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 */
_eglLog(_EGL_DEBUG, "Closing %s", drv->Name);
- /*
- * XXX check for currently bound context/surfaces and delete them?
- */
+ _eglReleaseDisplayResources(drv, 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;
}
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;
+}