egl: Make egl_dri2 and egl_glx built-in drivers.
authorChia-I Wu <olv@lunarg.com>
Fri, 7 Jan 2011 08:30:08 +0000 (16:30 +0800)
committerChia-I Wu <olv@lunarg.com>
Mon, 10 Jan 2011 03:50:34 +0000 (11:50 +0800)
These two drivers are small in size.  Making them built-in should
simplify packaging.

configure.ac
docs/egl.html
src/egl/Makefile
src/egl/drivers/Makefile.template
src/egl/drivers/dri2/Makefile
src/egl/drivers/dri2/egl_dri2.c
src/egl/drivers/glx/Makefile
src/egl/drivers/glx/egl_glx.c
src/egl/main/Makefile
src/egl/main/egldriver.c
src/egl/main/egldriver.h

index ca2a05ca48a4ed674df3b68e11c655ba0e378cdc..08a8b616f781242e10c8f79bded920921555a206 100644 (file)
@@ -1783,7 +1783,7 @@ if test "$enable_egl" = yes; then
 
     egl_drivers=""
     for d in $EGL_DRIVERS_DIRS; do
-        egl_drivers="$egl_drivers egl_$d"
+        egl_drivers="$egl_drivers builtin:egl_$d"
     done
 
     if test "$enable_gallium" = yes -a "$HAVE_ST_EGL" = yes; then
index 33e9187ce7f9f1288fc61e2e6abfed635f6784ed..a92f9d1b1d7b3fcde941164091fd2839abae53b2 100644 (file)
@@ -148,9 +148,10 @@ may set</p>
 
 <li><code>EGL_DRIVER</code>
 
-<p>This variable specifies a full path to an EGL driver and it forces the
-specified EGL driver to be loaded.  It comes in handy when one wants to test a
-specific driver.  This variable is ignored for setuid/setgid binaries.</p>
+<p>This variable specifies a full path to or the name of an EGL driver.  It
+forces the specified EGL driver to be loaded.  It comes in handy when one wants
+to test a specific driver.  This variable is ignored for setuid/setgid
+binaries.</p>
 
 </li>
 
index 5b09e178c63b6f8a5fa09a5d617fbb0f7d96c56e..50f227f07dac1ea9865580231c8c051ae0150014 100644 (file)
@@ -3,7 +3,7 @@
 TOP = ../..
 include $(TOP)/configs/current
 
-SUBDIRS = main drivers
+SUBDIRS = drivers main
 
 
 default: subdirs
index 47709e3c59f5a93b21c4605ce2d3d5ea64f5bb44..76dbe260c6b77c8917c3549f67593679107720e0 100644 (file)
@@ -2,6 +2,7 @@
 #
 # Drivers should define
 #
+# EGL_BUILTIN, the driver is built-in or external
 # EGL_DRIVER, the driver name
 # EGL_SOURCES, the driver sources
 # EGL_INCLUDES, the include pathes
 #
 
 
-EGL_DRIVER_PATH = $(TOP)/$(LIB_DIR)/egl/$(EGL_DRIVER)
+EGL_DRIVER_PATH = $(TOP)/$(LIB_DIR)/egl/$(EGL_DRIVER).so
 EGL_OBJECTS = $(EGL_SOURCES:.c=.o)
 
+# built-in or external
+ifeq ($(EGL_BUILTIN),true)
+EGL_TARGET = lib$(EGL_DRIVER).a
+EGL_INSTALL =
+else
+EGL_TARGET = $(EGL_DRIVER_PATH)
+EGL_INSTALL = install-so
+endif
 
-default: depend $(EGL_DRIVER_PATH)
+default: depend $(EGL_TARGET)
 
-$(EGL_DRIVER_PATH): $(EGL_DRIVER)
+$(EGL_DRIVER_PATH): $(EGL_DRIVER).so
        @$(INSTALL) -d $(TOP)/$(LIB_DIR)/egl
        $(INSTALL) $< $(TOP)/$(LIB_DIR)/egl
 
-$(EGL_DRIVER): $(EGL_OBJECTS) Makefile $(TOP)/src/egl/drivers/Makefile.template
-       @$(MKLIB) -o $(EGL_DRIVER) -noprefix \
+$(EGL_DRIVER).so: $(EGL_OBJECTS) Makefile $(TOP)/src/egl/drivers/Makefile.template
+       @$(MKLIB) -o $(EGL_DRIVER).so -noprefix \
                -linker '$(CC)' -ldflags '-L$(TOP)/$(LIB_DIR) $(LDFLAGS)' \
                $(MKLIB_OPTIONS) \
                $(EGL_OBJECTS) $(EGL_LIBS) -l$(EGL_LIB)
 
+lib$(EGL_DRIVER).a: $(EGL_OBJECTS) Makefile $(TOP)/src/egl/drivers/Makefile.template
+       @$(MKLIB) -o $(EGL_DRIVER) -static $(EGL_OBJECTS)
+
 .c.o:
        $(CC) -c $(EGL_INCLUDES) $(CFLAGS) $(EGL_CFLAGS) $< -o $@
 
-
-install: $(EGL_DRIVER_PATH)
+install-so: $(EGL_DRIVER_PATH)
        $(INSTALL) -d $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR)
        $(MINSTALL) $(EGL_DRIVER_PATH) $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR)
 
+install: $(EGL_INSTALL)
+
 clean:
-       rm -f $(EGL_DRIVER)
+       rm -f $(EGL_DRIVER).so
+       rm -f lib$(EGL_DRIVER).a
        rm -f $(EGL_OBJECTS)
        rm -f depend depend.bak
 
index ec4d1bcd9be38adad4b54d341e21a4ef5a134807..553ee8771f8457a932e989a2438b3a670b3a896f 100644 (file)
@@ -3,7 +3,7 @@
 TOP = ../../../..
 include $(TOP)/configs/current
 
-EGL_DRIVER = egl_dri2.so
+EGL_DRIVER = egl_dri2
 EGL_SOURCES = egl_dri2.c
 
 EGL_INCLUDES = \
@@ -17,4 +17,7 @@ EGL_INCLUDES = \
 
 EGL_LIBS = $(XCB_DRI2_LIBS) $(LIBUDEV_LIBS) $(DLOPEN_LIBS) $(LIBDRM_LIB)
 
+EGL_CFLAGS = -D_EGL_MAIN=_eglBuiltInDriverDRI2
+EGL_BUILTIN = true
+
 include ../Makefile.template
index 5223298020747a38e33e310bbad76c03dee7a7c8..8967969c924a9733f9959f1cd7008a2912143f98 100644 (file)
@@ -2372,7 +2372,7 @@ dri2_load(_EGLDriver *drv)
  * Create a new _EGLDriver object and init its dispatch table.
  */
 _EGLDriver *
-_eglMain(const char *args)
+_EGL_MAIN(const char *args)
 {
    struct dri2_egl_driver *dri2_drv;
 
index 89981e6c3a70e0fb6126d332e0c0ca9df7b9e7c4..a1e6b731fe9b819d073f01535488f572b5532577 100644 (file)
@@ -3,7 +3,7 @@
 TOP = ../../../..
 include $(TOP)/configs/current
 
-EGL_DRIVER = egl_glx.so
+EGL_DRIVER = egl_glx
 EGL_SOURCES = egl_glx.c
 
 EGL_INCLUDES = \
@@ -13,4 +13,7 @@ EGL_INCLUDES = \
 EGL_CFLAGS = $(X11_CFLAGS)
 EGL_LIBS = $(X11_LIBS) $(DLOPEN_LIBS)
 
+EGL_CFLAGS += -D_EGL_MAIN=_eglBuiltInDriverGLX
+EGL_BUILTIN = true
+
 include ../Makefile.template
index db9109dacc5d8ab5efbf13fd2e4eaf904c888162..5fce06d66df4a6798c98bd29d28c3a2fc48e0c69 100644 (file)
@@ -1115,7 +1115,7 @@ fail:
  * Create a new _EGLDriver object and init its dispatch table.
  */
 _EGLDriver *
-_eglMain(const char *args)
+_EGL_MAIN(const char *args)
 {
    struct GLX_egl_driver *GLX_drv = CALLOC_STRUCT(GLX_egl_driver);
 
index b4ca20c094a502cf73a64ddcbba3117c70292534..0eb309c196947df066e48112a24952b7f373d9d0 100644 (file)
@@ -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
index e5d8a39a4c8f9ef12da5ab27de4f6a4a674fd649..62c56955134f7706a921056a177bd7a28480342a 100644 (file)
@@ -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);
 }
index 1a0aaad1f8c2b27b9ad0b4041e3debbdc222f990..651788cb7ae1f8dbfec6c95d768cf7615ec296f9 100644 (file)
@@ -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);