Browse Source

egl: Add support for driver built-in.

This allows an EGL driver to be compiled together with libEGL.so.  It
eliminates the need to specify a driver, or support module loading on
new platforms.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
tags/mesa_7_7_rc1
Chia-I Wu 16 years ago
parent
commit
5541988578
2 changed files with 93 additions and 68 deletions
  1. 93
    64
      src/egl/main/egldriver.c
  2. 0
    4
      src/egl/main/egllog.c

+ 93
- 64
src/egl/main/egldriver.c View File

@@ -22,59 +22,70 @@

#if defined(_EGL_PLATFORM_X)
#include <dlfcn.h>
#elif defined(_EGL_PLATFORM_WINDOWS)
/* 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
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
}

/* XXX Need to decide how to do dynamic name lookup on Windows */
static const char DefaultDriverName[] = "TBD";

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)
static const char *DefaultDriverName = "egl_softpipe";

typedef void * lib_handle;

static void *
open_library(const char *filename)
{
return dlopen(filename, RTLD_LAZY);
}
static const char DefaultDriverName[] = "egl_softpipe";

typedef void * lib_handle;

static void *
open_library(const char *filename)
{
return dlopen(filename, RTLD_LAZY);
}

static void
close_library(void *lib)
{
dlclose(lib);
}

#else /* _EGL_PLATFORM_NO_OS */

static const char DefaultDriverName[] = "builtin";

typedef void *lib_handle;

static INLINE void *
open_library(const char *filename)
{
return (void *) filename;
}

static INLINE void
close_library(void *lib)
{
}


static void
close_library(void *lib)
{
dlclose(lib);
}
#endif


@@ -95,14 +106,22 @@ _eglChooseDriver(_EGLDisplay *dpy, char **argsRet)
path = _eglstrdup(path);

#if defined(_EGL_PLATFORM_X)
if (!path && dpy->NativeDisplay) {
if (!path && dpy && dpy->NativeDisplay) {
/* assume (wrongly!) that the native display is a display string */
path = _eglSplitDisplayString((const char *) dpy->NativeDisplay, &args);
}
suffix = "so";
#elif defined(_EGL_PLATFORM_WINDOWS)
suffix = "dll";
#endif /* _EGL_PLATFORM_X */
#else /* _EGL_PLATFORM_NO_OS */
if (path) {
/* force the use of the default driver */
_eglLog(_EGL_DEBUG, "ignore EGL_DRIVER");
free(path);
path = NULL;
}
suffix = NULL;
#endif

if (!path)
path = _eglstrdup(DefaultDriverName);
@@ -136,43 +155,48 @@ _eglChooseDriver(_EGLDisplay *dpy, char **argsRet)
static _EGLMain_t
_eglOpenLibrary(const char *driverPath, lib_handle *handle)
{
_EGLMain_t mainFunc;
lib_handle lib;
_EGLMain_t mainFunc = NULL;
const char *error = "unknown error";

assert(driverPath);

#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 */
_eglLog(_EGL_DEBUG, "dlopen(%s)", driverPath);
lib = open_library(driverPath);
if (!lib) {
_eglLog(_EGL_WARNING, "Could not open %s",
driverPath);
return NULL;

#if defined(_EGL_PLATFORM_WINDOWS)
/* XXX untested */
if (lib)
mainFunc = (_EGLMain_t) GetProcAddress(lib, "_eglMain");
#elif defined(_EGL_PLATFORM_X)
if (lib) {
mainFunc = (_EGLMain_t) dlsym(lib, "_eglMain");
if (!mainFunc)
error = dlerror();
}
else {
error = dlerror();
}
mainFunc = (_EGLMain_t) GetProcAddress(lib, "_eglMain");
#else /* _EGL_PLATFORM_NO_OS */
/* must be the default driver name */
if (strcmp(driverPath, DefaultDriverName) == 0)
mainFunc = (_EGLMain_t) _eglMain;
else
error = "not builtin driver";
#endif
#elif defined(_EGL_PLATFORM_X)
_eglLog(_EGL_DEBUG, "dlopen(%s)", driverPath);
lib = open_library(driverPath);

if (!lib) {
_eglLog(_EGL_WARNING, "Could not open %s (%s)",
driverPath, dlerror());
_eglLog(_EGL_WARNING, "Could not open driver %s (%s)",
driverPath, error);
if (!getenv("EGL_DRIVER"))
_eglLog(_EGL_WARNING,
"The driver can be overridden by setting EGL_DRIVER");
return NULL;
}
mainFunc = (_EGLMain_t) dlsym(lib, "_eglMain");
#endif

if (!mainFunc) {
_eglLog(_EGL_WARNING, "_eglMain not found in %s", driverPath);
_eglLog(_EGL_WARNING, "_eglMain not found in %s (%s)",
driverPath, error);
if (lib)
close_library(lib);
return NULL;
@@ -428,6 +452,11 @@ _eglFindAPIs(void)
const char *es2_libname = "libGLESv2.so";
const char *gl_libname = "libGL.so";
const char *vg_libname = "libOpenVG.so";
#else /* _EGL_PLATFORM_NO_OS */
const char *es1_libname = NULL;
const char *es2_libname = NULL;
const char *gl_libname = NULL;
const char *vg_libname = NULL;
#endif

if ((lib = open_library(es1_libname))) {

+ 0
- 4
src/egl/main/egllog.c View File

@@ -21,11 +21,7 @@ static EGLint ReportingLevel = -1;
static void
log_level_initialize(void)
{
#if defined(_EGL_PLATFORM_X)
char *log_env = getenv("EGL_LOG_LEVEL");
#else
char *log_env = NULL;
#endif

if (log_env == NULL) {
ReportingLevel = FALLBACK_LOG_LEVEL;

Loading…
Cancel
Save