From c98ea26e16b6458b4385d6558936696e4d099455 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 7 Jan 2011 16:30:08 +0800 Subject: egl: Make egl_dri2 and egl_glx built-in drivers. These two drivers are small in size. Making them built-in should simplify packaging. --- src/egl/main/Makefile | 16 +++++- src/egl/main/egldriver.c | 135 ++++++++++++++++++----------------------------- src/egl/main/egldriver.h | 8 +++ 3 files changed, 73 insertions(+), 86 deletions(-) (limited to 'src/egl/main') diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile index b4ca20c094..0eb309c196 100644 --- a/src/egl/main/Makefile +++ b/src/egl/main/Makefile @@ -52,6 +52,19 @@ OBJECTS = $(SOURCES:.c=.o) # use dl*() to load drivers LOCAL_CFLAGS = -D_EGL_OS_UNIX=1 +LOCAL_LIBS = + +# egl_dri2 and egl_glx are built-ins +ifeq ($(filter dri2, $(EGL_DRIVERS_DIRS)),dri2) +LOCAL_CFLAGS += -D_EGL_BUILT_IN_DRIVER_DRI2 +LOCAL_LIBS += $(TOP)/src/egl/drivers/dri2/libegl_dri2.a +EGL_LIB_DEPS += $(XCB_DRI2_LIBS) $(LIBUDEV_LIBS) $(DLOPEN_LIBS) $(LIBDRM_LIB) +endif +ifeq ($(filter glx, $(EGL_DRIVERS_DIRS)),glx) +LOCAL_CFLAGS += -D_EGL_BUILT_IN_DRIVER_GLX +LOCAL_LIBS += $(TOP)/src/egl/drivers/glx/libegl_glx.a +EGL_LIB_DEPS += $(X11_LIBS) $(DLOPEN_LIBS) +endif # translate --with-egl-platforms to _EGLPlatformType EGL_NATIVE_PLATFORM=_EGL_INVALID_PLATFORM @@ -84,7 +97,8 @@ $(TOP)/$(LIB_DIR)/$(EGL_LIB_NAME): $(OBJECTS) $(MKLIB) -o $(EGL_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -major $(EGL_MAJOR) -minor $(EGL_MINOR) \ -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ - $(EGL_LIB_DEPS) $(OBJECTS) + -L$(TOP)/$(LIB_DIR) $(EGL_LIB_DEPS) \ + $(OBJECTS) $(LOCAL_LIBS) install-headers: $(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/KHR diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c index e5d8a39a4c..62c5695513 100644 --- a/src/egl/main/egldriver.c +++ b/src/egl/main/egldriver.c @@ -25,6 +25,7 @@ typedef struct _egl_module { char *Path; + _EGLMain_t BuiltIn; void *Handle; _EGLDriver *Driver; } _EGLModule; @@ -32,6 +33,18 @@ typedef struct _egl_module { static _EGL_DECLARE_MUTEX(_eglModuleMutex); static _EGLArray *_eglModules; +const struct { + const char *name; + _EGLMain_t main; +} _eglBuiltInDrivers[] = { +#ifdef _EGL_BUILT_IN_DRIVER_DRI2 + { "egl_dri2", _eglBuiltInDriverDRI2 }, +#endif +#ifdef _EGL_BUILT_IN_DRIVER_GLX + { "egl_glx", _eglBuiltInDriverGLX }, +#endif + { NULL, NULL } +}; /** * Wrappers for dlopen/dlclose() @@ -157,9 +170,18 @@ _eglLoadModule(_EGLModule *mod) lib_handle lib; _EGLDriver *drv; - mainFunc = _eglOpenLibrary(mod->Path, &lib); - if (!mainFunc) - return EGL_FALSE; + if (mod->Driver) + return EGL_TRUE; + + if (mod->BuiltIn) { + lib = (lib_handle) NULL; + mainFunc = mod->BuiltIn; + } + else { + mainFunc = _eglOpenLibrary(mod->Path, &lib); + if (!mainFunc) + return EGL_FALSE; + } drv = mainFunc(NULL); if (!drv) { @@ -312,68 +334,6 @@ _eglLoaderFile(const char *dir, size_t len, void *loader_data) } -/** - * A loader function for use with _eglPreloadForEach. The loader data is the - * pattern (prefix) of the files to look for. - */ -static EGLBoolean -_eglLoaderPattern(const char *dir, size_t len, void *loader_data) -{ -#if defined(_EGL_OS_UNIX) - const char *prefix, *suffix; - size_t prefix_len, suffix_len; - DIR *dirp; - struct dirent *dirent; - char path[1024]; - - if (len + 2 > sizeof(path)) - return EGL_TRUE; - if (len) { - memcpy(path, dir, len); - path[len++] = '/'; - } - path[len] = '\0'; - - dirp = opendir(path); - if (!dirp) - return EGL_TRUE; - - prefix = (const char *) loader_data; - prefix_len = strlen(prefix); - suffix = library_suffix(); - suffix_len = (suffix) ? strlen(suffix) : 0; - - while ((dirent = readdir(dirp))) { - size_t dirent_len = strlen(dirent->d_name); - const char *p; - - /* match the prefix */ - if (strncmp(dirent->d_name, prefix, prefix_len) != 0) - continue; - /* match the suffix */ - if (suffix) { - p = dirent->d_name + dirent_len - suffix_len; - if (p < dirent->d_name || strcmp(p, suffix) != 0) - continue; - } - - /* make a full path and add it to the module array */ - if (len + dirent_len + 1 <= sizeof(path)) { - strcpy(path + len, dirent->d_name); - _eglAddModule(path); - } - } - - closedir(dirp); - - return EGL_TRUE; -#else /* _EGL_OS_UNIX */ - /* stop immediately */ - return EGL_FALSE; -#endif -} - - /** * Run the callback function on each driver directory. * @@ -489,34 +449,37 @@ _eglAddUserDriver(void) } } #endif /* _EGL_OS_UNIX */ - if (env) + if (env) { + _EGLModule *mod; + EGLint i; + + /* env can be a path */ _eglPreloadForEach(search_path, _eglLoaderFile, (void *) env); + /* or the name of a built-in driver */ + for (i = 0; _eglBuiltInDrivers[i].name; i++) { + if (!strcmp(_eglBuiltInDrivers[i].name, env)) { + mod = _eglAddModule(env); + if (mod) + mod->BuiltIn = _eglBuiltInDrivers[i].main; + } + } + } } /** - * Add default drivers to the module array. + * Add built-in drivers to the module array. */ static void -_eglAddDefaultDrivers(void) +_eglAddBuiltInDrivers(void) { - const char *search_path = _eglGetSearchPath(); + _EGLModule *mod; EGLint i; -#if defined(_EGL_OS_WINDOWS) - const char *DefaultDriverNames[] = { - "egl_gallium" - }; -#elif defined(_EGL_OS_UNIX) - const char *DefaultDriverNames[] = { - "egl_gallium", - "egl_dri2", - "egl_glx" - }; -#endif - for (i = 0; i < ARRAY_SIZE(DefaultDriverNames); i++) { - void *name = (void *) DefaultDriverNames[i]; - _eglPreloadForEach(search_path, _eglLoaderFile, name); + for (i = 0; _eglBuiltInDrivers[i].name; i++) { + mod = _eglAddModule(_eglBuiltInDrivers[i].name); + if (mod) + mod->BuiltIn = _eglBuiltInDrivers[i].main; } } @@ -528,13 +491,15 @@ _eglAddDefaultDrivers(void) static EGLBoolean _eglAddDrivers(void) { + void *external = (void *) "egl_gallium"; + if (_eglModules) return EGL_TRUE; /* the order here decides the priorities of the drivers */ _eglAddUserDriver(); - _eglAddDefaultDrivers(); - _eglPreloadForEach(_eglGetSearchPath(), _eglLoaderPattern, (void *) "egl_"); + _eglPreloadForEach(_eglGetSearchPath(), _eglLoaderFile, external); + _eglAddBuiltInDrivers(); return (_eglModules != NULL); } diff --git a/src/egl/main/egldriver.h b/src/egl/main/egldriver.h index 1a0aaad1f8..651788cb7a 100644 --- a/src/egl/main/egldriver.h +++ b/src/egl/main/egldriver.h @@ -64,6 +64,14 @@ struct _egl_driver }; +extern _EGLDriver * +_eglBuiltInDriverDRI2(const char *args); + + +extern _EGLDriver * +_eglBuiltInDriverGLX(const char *args); + + PUBLIC _EGLDriver * _eglMain(const char *args); -- cgit v1.2.3