Mesa (master): st/egl: One driver per hardware.

Chia-I Wu olv at kemper.freedesktop.org
Tue Jun 29 02:17:25 PDT 2010


Module: Mesa
Branch: master
Commit: ea05299ce54ea0463626277907cab8e849884740
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ea05299ce54ea0463626277907cab8e849884740

Author: Chia-I Wu <olv at lunarg.com>
Date:   Thu Jun 17 23:45:41 2010 +0800

st/egl: One driver per hardware.

Merge multiple egl_<platform>_<pipe>.so into a single
egl_gallium_<pipe>.so.  The environment variable EGL_PLATFORM is now
used to modify the return value of _eglGetNativePlatform.

---

 src/egl/main/Makefile                              |    3 -
 src/egl/main/SConscript                            |    1 -
 src/egl/main/egldisplay.c                          |   56 ++++++++++++
 src/egl/main/egldisplay.h                          |    4 +
 src/egl/main/egldriver.c                           |   42 ++--------
 src/egl/main/egldriver.h                           |    5 -
 src/gallium/state_trackers/egl/Makefile            |   49 +++++++----
 src/gallium/state_trackers/egl/SConscript          |    3 +
 src/gallium/state_trackers/egl/common/egl_g3d.c    |   48 +++++++++--
 src/gallium/state_trackers/egl/common/egl_g3d.h    |    2 +-
 src/gallium/state_trackers/egl/common/native.h     |   11 ++-
 .../state_trackers/egl/fbdev/native_fbdev.c        |    2 +-
 src/gallium/state_trackers/egl/gdi/native_gdi.c    |    2 +-
 src/gallium/state_trackers/egl/kms/native_kms.c    |    2 +-
 src/gallium/state_trackers/egl/x11/native_x11.c    |    2 +-
 src/gallium/targets/Makefile.egl                   |   90 ++++++++------------
 16 files changed, 190 insertions(+), 132 deletions(-)

diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile
index be27d94..3834a5d 100644
--- a/src/egl/main/Makefile
+++ b/src/egl/main/Makefile
@@ -51,8 +51,6 @@ OBJECTS = $(SOURCES:.c=.o)
 # use dl*() to load drivers
 LOCAL_CFLAGS = -D_EGL_OS_UNIX=1
 
-EGL_DEFAULT_PLATFORM = $(firstword $(EGL_PLATFORMS))
-
 # translate --with-egl-platforms to _EGLPlatformType
 EGL_NATIVE_PLATFORM=_EGL_INVALID_PLATFORM
 ifeq ($(firstword $(EGL_PLATFORMS)),x11)
@@ -67,7 +65,6 @@ endif
 
 LOCAL_CFLAGS += \
 	-D_EGL_NATIVE_PLATFORM=$(EGL_NATIVE_PLATFORM) \
-	-D_EGL_DEFAULT_PLATFORM=\"$(EGL_DEFAULT_PLATFORM)\" \
 	-D_EGL_DRIVER_SEARCH_DIR=\"$(EGL_DRIVER_INSTALL_DIR)\"
 
 .c.o:
diff --git a/src/egl/main/SConscript b/src/egl/main/SConscript
index fad0671..69ad873 100644
--- a/src/egl/main/SConscript
+++ b/src/egl/main/SConscript
@@ -10,7 +10,6 @@ if env['platform'] != 'winddk':
 
 	env.Append(CPPDEFINES = [
 		'_EGL_NATIVE_PLATFORM=_EGL_PLATFORM_WINDOWS',
-		'_EGL_DEFAULT_PLATFORM=\\"gdi\\"',
 		'_EGL_DRIVER_SEARCH_DIR=\\"\\"',
 		'_EGL_OS_WINDOWS',
 		'KHRONOS_DLL_EXPORTS',
diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
index d666bda..9980356 100644
--- a/src/egl/main/egldisplay.c
+++ b/src/egl/main/egldisplay.c
@@ -15,6 +15,62 @@
 
 
 /**
+ * Return the native platform by parsing EGL_PLATFORM.
+ */
+static _EGLPlatformType
+_eglGetNativePlatformFromEnv(void)
+{
+   /* map --with-egl-platforms names to platform types */
+   static const struct {
+      _EGLPlatformType platform;
+      const char *name;
+   } egl_platforms[_EGL_NUM_PLATFORMS] = {
+      { _EGL_PLATFORM_WINDOWS, "gdi" },
+      { _EGL_PLATFORM_X11, "x11" },
+      { _EGL_PLATFORM_DRM, "kms" },
+      { _EGL_PLATFORM_FBDEV, "fbdev" }
+   };
+   _EGLPlatformType plat = _EGL_INVALID_PLATFORM;
+   const char *plat_name;
+   EGLint i;
+
+   plat_name = getenv("EGL_PLATFORM");
+   /* try deprecated env variable */
+   if (!plat_name || !plat_name[0])
+      plat_name = getenv("EGL_DISPLAY");
+   if (!plat_name || !plat_name[0])
+      return _EGL_INVALID_PLATFORM;
+
+   for (i = 0; i < _EGL_NUM_PLATFORMS; i++) {
+      if (strcmp(egl_platforms[i].name, plat_name) == 0) {
+         plat = egl_platforms[i].platform;
+         break;
+      }
+   }
+
+   return plat;
+}
+
+
+/**
+ * Return the native platform.  It is the platform of the EGL native types.
+ */
+_EGLPlatformType
+_eglGetNativePlatform(void)
+{
+   static _EGLPlatformType native_platform = _EGL_INVALID_PLATFORM;
+
+   if (native_platform == _EGL_INVALID_PLATFORM) {
+      native_platform = _eglGetNativePlatformFromEnv();
+      if (native_platform == _EGL_INVALID_PLATFORM)
+         native_platform = _EGL_NATIVE_PLATFORM;
+   }
+
+   return native_platform;
+}
+
+
+/**
  * Finish display management.
  */
 void
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
index 0b325f7..5a1caa9 100644
--- a/src/egl/main/egldisplay.h
+++ b/src/egl/main/egldisplay.h
@@ -101,6 +101,10 @@ struct _egl_display
 };
 
 
+extern _EGLPlatformType
+_eglGetNativePlatform(void);
+
+
 extern void
 _eglFiniDisplay(void);
 
diff --git a/src/egl/main/egldriver.c b/src/egl/main/egldriver.c
index db7b4a7..c65df28 100644
--- a/src/egl/main/egldriver.c
+++ b/src/egl/main/egldriver.c
@@ -39,7 +39,7 @@
 
 /* XXX Need to decide how to do dynamic name lookup on Windows */
 static const char *DefaultDriverNames[] = {
-   "egl_gdi_swrast"
+   "egl_gallium_swrast"
 };
 
 typedef HMODULE lib_handle;
@@ -464,36 +464,16 @@ _eglPreloadUserDriver(void)
 
 
 /**
- * Preload platform drivers.
- *
- * Platform drivers are a set of drivers that support a certain window system.
- * The window system may be specified by EGL_PLATFORM.
+ * Preload Gallium drivers.
  *
  * FIXME This makes libEGL a memory hog if an user driver is not specified and
- * there are many platform drivers.
+ * there are many Gallium drivers
  */
 static EGLBoolean
-_eglPreloadPlatformDrivers(void)
+_eglPreloadGalliumDrivers(void)
 {
-   const char *dpy;
-   char prefix[32];
-   int ret;
-
-   dpy = getenv("EGL_PLATFORM");
-   /* try deprecated env variable */
-   if (!dpy || !dpy[0])
-      dpy = getenv("EGL_DISPLAY");
-   if (!dpy || !dpy[0])
-      dpy = _EGL_DEFAULT_PLATFORM;
-   if (!dpy || !dpy[0])
-      return EGL_FALSE;
-
-   ret = _eglsnprintf(prefix, sizeof(prefix), "egl_%s_", dpy);
-   if (ret < 0 || ret >= sizeof(prefix))
-      return EGL_FALSE;
-
    return (_eglPreloadForEach(_eglGetSearchPath(),
-            _eglLoaderPattern, (void *) prefix) > 0);
+            _eglLoaderPattern, (void *) "egl_gallium_") > 0);
 }
 
 
@@ -518,7 +498,7 @@ _eglPreloadDrivers(void)
    }
 
    loaded = (_eglPreloadUserDriver() ||
-             _eglPreloadPlatformDrivers());
+             _eglPreloadGalliumDrivers());
 
    _eglUnlockMutex(_eglGlobal.Mutex);
 
@@ -581,16 +561,6 @@ _eglLoadDefaultDriver(EGLDisplay dpy, EGLint *major, EGLint *minor)
 
 
 /**
- * Return the native platform.  It is the platform of the EGL native types.
- */
-_EGLPlatformType
-_eglGetNativePlatform(void)
-{
-   return _EGL_NATIVE_PLATFORM;
-}
-
-
-/**
  * Plug all the available fallback routines into the given driver's
  * dispatch table.
  */
diff --git a/src/egl/main/egldriver.h b/src/egl/main/egldriver.h
index 6a52374..8b34c43 100644
--- a/src/egl/main/egldriver.h
+++ b/src/egl/main/egldriver.h
@@ -3,7 +3,6 @@
 
 
 #include "egltypedefs.h"
-#include "egldisplay.h"
 #include "eglapi.h"
 
 
@@ -89,10 +88,6 @@ extern _EGLDriver *
 _eglLoadDefaultDriver(EGLDisplay dpy, EGLint *major, EGLint *minor);
 
 
-extern _EGLPlatformType
-_eglGetNativePlatform(void);
-
-
 PUBLIC void
 _eglInitDriverFallbacks(_EGLDriver *drv);
 
diff --git a/src/gallium/state_trackers/egl/Makefile b/src/gallium/state_trackers/egl/Makefile
index fec178f..7bb5349 100644
--- a/src/gallium/state_trackers/egl/Makefile
+++ b/src/gallium/state_trackers/egl/Makefile
@@ -38,23 +38,30 @@ fbdev_OBJECTS = $(fbdev_SOURCES:.c=.o)
 
 ALL_INCLUDES = $(common_INCLUDES) $(x11_INCLUDES) $(kms_INCLUDES) $(fbdev_INCLUDES)
 ALL_SOURCES = $(common_SOURCES) $(x11_SOURCES) $(kms_SOURCES) $(fbdev_SOURCES)
-ALL_OBJECTS = $(common_OBJECTS) $(x11_OBJECTS) $(kms_OBJECTS) $(fbdev_OBJECTS)
 
-##### TARGETS #####
-
-EGL_PLATFORMS_MODS = $(foreach plat, $(EGL_PLATFORMS), libegl$(plat).a)
-
-default: depend $(EGL_PLATFORMS_MODS)
+EGL_OBJECTS = $(common_OBJECTS)
+EGL_CPPFLAGS = $(common_INCLUDES)
+
+# add backends
+ifneq ($(findstring x11, $(EGL_PLATFORMS)),)
+EGL_OBJECTS += $(x11_OBJECTS)
+EGL_CPPFLAGS += -DHAVE_X11_BACKEND
+endif
+ifneq ($(findstring kms, $(EGL_PLATFORMS)),)
+EGL_OBJECTS += $(kms_OBJECTS)
+EGL_CPPFLAGS += -DHAVE_KMS_BACKEND
+endif
+ifneq ($(findstring fbdev, $(EGL_PLATFORMS)),)
+EGL_OBJECTS += $(fbdev_OBJECTS)
+EGL_CPPFLAGS += -DHAVE_FBDEV_BACKEND
+endif
 
+##### TARGETS #####
 
-libeglx11.a: $(x11_OBJECTS) $(common_OBJECTS) Makefile
-	$(MKLIB) -o eglx11 -static $(x11_OBJECTS) $(common_OBJECTS)
-
-libeglkms.a: $(kms_OBJECTS) $(common_OBJECTS) Makefile
-	$(MKLIB) -o eglkms -static $(kms_OBJECTS) $(common_OBJECTS)
+default: depend libegl.a
 
-libeglfbdev.a: $(fbdev_OBJECTS) $(common_OBJECTS) Makefile
-	$(MKLIB) -o eglfbdev -static $(fbdev_OBJECTS) $(common_OBJECTS)
+libegl.a: $(EGL_OBJECTS) Makefile
+	$(MKLIB) -o egl -static $(EGL_OBJECTS)
 
 depend: 
 	rm -f depend
@@ -62,8 +69,8 @@ depend:
 	$(MKDEP) $(MKDEP_OPTIONS) $(ALL_INCLUDES) $(ALL_SOURCES) 2> /dev/null
 
 clean:
-	rm -f $(ALL_OBJECTS)
-	rm -f $(EGL_PLATFORMS_MODS)
+	rm -f libegl.a
+	rm -f $(EGL_OBJECTS)
 	rm -f depend depend.bak
 
 # Dummy target
@@ -72,16 +79,20 @@ install:
 
 ##### RULES #####
 
+define egl-cc
+$(CC) -c $(common_INCLUDES) $($(1)_INCLUDES) $(DEFINES) $(CFLAGS) $< -o $@
+endef
+
 $(common_OBJECTS): %.o: %.c
-	$(CC) -c $(common_INCLUDES) $(DEFINES) $(CFLAGS) $< -o $@
+	$(CC) -c $(EGL_CPPFLAGS) $(DEFINES) $(CFLAGS) $< -o $@
 
 $(x11_OBJECTS): %.o: %.c
-	$(CC) -c $(common_INCLUDES) $(x11_INCLUDES) $(DEFINES) $(CFLAGS) $< -o $@
+	$(call egl-cc,x11)
 
 $(kms_OBJECTS): %.o: %.c
-	$(CC) -c $(common_INCLUDES) $(kms_INCLUDES) $(DEFINES) $(CFLAGS) $< -o $@
+	$(call egl-cc,kms)
 
 $(fbdev_OBJECTS): %.o: %.c
-	$(CC) -c $(common_INCLUDES) $(fbdev_INCLUDES) $(DEFINES) $(CFLAGS) $< -o $@
+	$(call egl-cc,fbdev)
 
 sinclude depend
diff --git a/src/gallium/state_trackers/egl/SConscript b/src/gallium/state_trackers/egl/SConscript
index c4d01d6..e71aec3 100644
--- a/src/gallium/state_trackers/egl/SConscript
+++ b/src/gallium/state_trackers/egl/SConscript
@@ -12,6 +12,9 @@ if 'egl' in env['statetrackers']:
 	'#/src/gallium/winsys/sw',
 	'.',
     ])
+    env.Append(CPPDEFINES = [
+	'HAVE_GDI_BACKEND',
+    ])
 
     common_sources = [
         'common/egl_g3d.c',
diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.c b/src/gallium/state_trackers/egl/common/egl_g3d.c
index 6b54ee3..36354dd 100644
--- a/src/gallium/state_trackers/egl/common/egl_g3d.c
+++ b/src/gallium/state_trackers/egl/common/egl_g3d.c
@@ -66,14 +66,50 @@ egl_g3d_init_st(_EGLDriver *drv)
  * Get the native platform.
  */
 static const struct native_platform *
-egl_g3d_get_platform(_EGLDriver *drv)
+egl_g3d_get_platform(_EGLDriver *drv, _EGLPlatformType plat)
 {
    struct egl_g3d_driver *gdrv = egl_g3d_driver(drv);
 
-   if (!gdrv->platform)
-      gdrv->platform = native_get_platform();
+   if (!gdrv->platforms[plat]) {
+      const char *plat_name = NULL;
+      const struct native_platform *nplat = NULL;
 
-   return gdrv->platform;
+      switch (plat) {
+      case _EGL_PLATFORM_WINDOWS:
+         plat_name = "Windows";
+#ifdef HAVE_GDI_BACKEND
+         nplat = native_get_gdi_platform();
+#endif
+         break;
+      case _EGL_PLATFORM_X11:
+         plat_name = "X11";
+#ifdef HAVE_X11_BACKEND
+         nplat = native_get_x11_platform();
+#endif
+         break;
+      case _EGL_PLATFORM_DRM:
+         plat_name = "DRM";
+#ifdef HAVE_KMS_BACKEND
+         nplat = native_get_kms_platform();
+#endif
+         break;
+      case _EGL_PLATFORM_FBDEV:
+         plat_name = "FBDEV";
+#ifdef HAVE_FBDEV_BACKEND
+         nplat = native_get_fbdev_platform();
+#endif
+         break;
+      default:
+         break;
+      }
+
+      if (!nplat)
+         _eglLog(_EGL_WARNING, "unsupported platform %s", plat_name);
+
+      gdrv->platforms[plat] = nplat;
+   }
+
+   return gdrv->platforms[plat];
 }
 
 /**
@@ -88,7 +124,7 @@ egl_g3d_get_probe_result(_EGLDriver *drv, _EGLDisplay *dpy)
    struct native_probe *nprobe;
    const struct native_platform *nplat;
 
-   nplat = egl_g3d_get_platform(drv);
+   nplat = egl_g3d_get_platform(drv, dpy->Platform);
    if (!nplat || !nplat->create_probe)
       return NATIVE_PROBE_UNKNOWN;
 
@@ -484,7 +520,7 @@ egl_g3d_initialize(_EGLDriver *drv, _EGLDisplay *dpy,
    /* the probe object is unlikely to be needed again */
    egl_g3d_destroy_probe(drv, dpy);
 
-   nplat = egl_g3d_get_platform(drv);
+   nplat = egl_g3d_get_platform(drv, dpy->Platform);
    if (!nplat)
       return EGL_FALSE;
 
diff --git a/src/gallium/state_trackers/egl/common/egl_g3d.h b/src/gallium/state_trackers/egl/common/egl_g3d.h
index 2604316..a498dcf 100644
--- a/src/gallium/state_trackers/egl/common/egl_g3d.h
+++ b/src/gallium/state_trackers/egl/common/egl_g3d.h
@@ -47,7 +47,7 @@ struct egl_g3d_driver {
    struct st_api *stapis[ST_API_COUNT];
    EGLint api_mask;
 
-   const struct native_platform *platform;
+   const struct native_platform *platforms[_EGL_NUM_PLATFORMS];
    EGLint probe_key;
 };
 
diff --git a/src/gallium/state_trackers/egl/common/native.h b/src/gallium/state_trackers/egl/common/native.h
index 941adfc..c4d23bf 100644
--- a/src/gallium/state_trackers/egl/common/native.h
+++ b/src/gallium/state_trackers/egl/common/native.h
@@ -229,6 +229,15 @@ struct native_platform {
 };
 
 const struct native_platform *
-native_get_platform(void);
+native_get_gdi_platform(void);
+
+const struct native_platform *
+native_get_x11_platform(void);
+
+const struct native_platform *
+native_get_kms_platform(void);
+
+const struct native_platform *
+native_get_fbdev_platform(void);
 
 #endif /* _NATIVE_H_ */
diff --git a/src/gallium/state_trackers/egl/fbdev/native_fbdev.c b/src/gallium/state_trackers/egl/fbdev/native_fbdev.c
index ffd32fa..c0bc7b2 100644
--- a/src/gallium/state_trackers/egl/fbdev/native_fbdev.c
+++ b/src/gallium/state_trackers/egl/fbdev/native_fbdev.c
@@ -458,7 +458,7 @@ static const struct native_platform fbdev_platform = {
 };
 
 const struct native_platform *
-native_get_platform(void)
+native_get_fbdev_platform(void)
 {
    return &fbdev_platform;
 }
diff --git a/src/gallium/state_trackers/egl/gdi/native_gdi.c b/src/gallium/state_trackers/egl/gdi/native_gdi.c
index ba4ddff..4ec229a 100644
--- a/src/gallium/state_trackers/egl/gdi/native_gdi.c
+++ b/src/gallium/state_trackers/egl/gdi/native_gdi.c
@@ -394,7 +394,7 @@ static const struct native_platform gdi_platform = {
 };
 
 const struct native_platform *
-native_get_platform(void)
+native_get_gdi_platform(void)
 {
    return &gdi_platform;
 }
diff --git a/src/gallium/state_trackers/egl/kms/native_kms.c b/src/gallium/state_trackers/egl/kms/native_kms.c
index 8ee8099..dd4ea71 100644
--- a/src/gallium/state_trackers/egl/kms/native_kms.c
+++ b/src/gallium/state_trackers/egl/kms/native_kms.c
@@ -800,7 +800,7 @@ kms_init_platform(struct native_platform *nplat)
 static struct native_platform kms_platform;
 
 const struct native_platform *
-native_get_platform(void)
+native_get_kms_platform(void)
 {
    kms_init_platform(&kms_platform);
    return &kms_platform;
diff --git a/src/gallium/state_trackers/egl/x11/native_x11.c b/src/gallium/state_trackers/egl/x11/native_x11.c
index 6c0201c..7eec563 100644
--- a/src/gallium/state_trackers/egl/x11/native_x11.c
+++ b/src/gallium/state_trackers/egl/x11/native_x11.c
@@ -149,7 +149,7 @@ x11_init_platform(struct native_platform *nplat)
 static struct native_platform x11_platform;
 
 const struct native_platform *
-native_get_platform(void)
+native_get_x11_platform(void)
 {
    x11_init_platform(&x11_platform);
    return &x11_platform;
diff --git a/src/gallium/targets/Makefile.egl b/src/gallium/targets/Makefile.egl
index 3158560..7934f25 100644
--- a/src/gallium/targets/Makefile.egl
+++ b/src/gallium/targets/Makefile.egl
@@ -12,38 +12,31 @@
 EGL_DRIVER_OBJECTS = $(EGL_DRIVER_SOURCES:.c=.o)
 
 common_LIBS = -ldrm -lm -ldl
-
-# ximage backend calls gallium_wrap_screen, which requires libidentity.a and
-# libtrace.a
-x11_ST = $(TOP)/src/gallium/state_trackers/egl/libeglx11.a \
-	 $(TOP)/src/gallium/winsys/sw/xlib/libws_xlib.a \
-	 $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
-	 $(TOP)/src/gallium/drivers/identity/libidentity.a \
-	 $(TOP)/src/gallium/drivers/trace/libtrace.a \
-	 $(TOP)/src/gallium/drivers/rbug/librbug.a
-
-x11_LIBS = $(common_LIBS) -lX11 -lXext -lXfixes
-
-kms_ST = $(TOP)/src/gallium/state_trackers/egl/libeglkms.a
-kms_LIBS = $(common_LIBS)
-
-fbdev_ST = \
-	$(TOP)/src/gallium/state_trackers/egl/libeglfbdev.a \
-	$(TOP)/src/gallium/winsys/sw/fbdev/libfbdev.a \
+common_ST = \
+	$(TOP)/src/gallium/state_trackers/egl/libegl.a \
 	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
 	$(TOP)/src/gallium/drivers/identity/libidentity.a \
 	$(TOP)/src/gallium/drivers/trace/libtrace.a \
 	$(TOP)/src/gallium/drivers/rbug/librbug.a
-fbdev_LIBS = $(common_LIBS)
 
 ifeq ($(MESA_LLVM),1)
-x11_ST += $(TOP)/src/gallium/drivers/llvmpipe/libllvmpipe.a
-x11_LIBS += $(LLVM_LIBS)
-fbdev_ST += $(TOP)/src/gallium/drivers/llvmpipe/libllvmpipe.a
-fbdev_LIBS += $(LLVM_LIBS)
+common_ST += $(TOP)/src/gallium/drivers/llvmpipe/libllvmpipe.a
+common_LIBS += $(LLVM_LIBS)
 LDFLAGS += $(LLVM_LDFLAGS)
 endif
 
+ifeq ($(findstring x11, $(EGL_PLATFORMS)),x11)
+common_LIBS += -lX11 -lXext -lXfixes
+common_ST += $(TOP)/src/gallium/winsys/sw/xlib/libws_xlib.a
+endif
+
+ifeq ($(findstring kms, $(EGL_PLATFORMS)),kms)
+endif
+
+ifeq ($(findstring fbdev, $(EGL_PLATFORMS)),fbdev)
+common_ST += $(TOP)/src/gallium/winsys/sw/fbdev/libfbdev.a
+endif
+
 ### Include directories
 INCLUDES = \
 	-I$(TOP)/include \
@@ -62,47 +55,32 @@ INCLUDES = \
 
 ##### TARGETS #####
 
-ifeq ($(EGL_DRIVER_NAME),swrast)
-EGL_PLATFORMS := $(filter-out kms, $(EGL_PLATFORMS))
-else
-EGL_PLATFORMS := $(filter-out fbdev, $(EGL_PLATFORMS))
-endif
-
-EGL_PLATFORM_DRIVERS = $(foreach plat, $(EGL_PLATFORMS), egl_$(plat)_$(EGL_DRIVER_NAME).so)
+EGL_LIB_DIR = $(TOP)/$(LIB_DIR)/egl
 
-EGL_PLATFORM_LIBS = $(foreach drv, $(EGL_PLATFORM_DRIVERS), $(TOP)/$(LIB_DIR)/egl/$(drv))
-
-default: $(EGL_PLATFORM_LIBS)
-
-$(EGL_PLATFORM_LIBS): $(TOP)/$(LIB_DIR)/egl/%.so: %.so
-	@$(INSTALL) -d $(TOP)/$(LIB_DIR)/egl
-	$(INSTALL) $< $(TOP)/$(LIB_DIR)/egl
-
-define mklib-egl
-$(MKLIB) -o $@ -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \
-	$(MKLIB_OPTIONS) $(EGL_DRIVER_OBJECTS) \
-	-Wl,--start-group $($(1)_ST) $(EGL_DRIVER_PIPES) \
-	$(GALLIUM_AUXILIARIES) -Wl,--end-group \
-	$($(1)_LIBS) $(EGL_DRIVER_LIBS) -L$(TOP)/$(LIB_DIR) -l$(EGL_LIB)
-endef
+# do not build the driver if the platform is KMS only and the driver is swrast
+ifneq ($(EGL_PLATFORMS)-$(EGL_DRIVER_NAME),kms-swrast)
+EGL_DRIVER = egl_gallium_$(EGL_DRIVER_NAME).so
+endif
 
-egl_x11_$(EGL_DRIVER_NAME).so: $(EGL_DRIVER_OBJECTS) $(x11_ST) $(EGL_DRIVER_PIPES) $(GALLIUM_AUXILIARIES) Makefile
-	$(call mklib-egl,x11)
+default: $(EGL_LIB_DIR)/$(EGL_DRIVER)
 
-egl_kms_$(EGL_DRIVER_NAME).so: $(EGL_DRIVER_OBJECTS) $(kms_ST) $(EGL_DRIVER_PIPES) $(GALLIUM_AUXILIARIES) Makefile
-	$(call mklib-egl,kms)
+$(EGL_LIB_DIR)/$(EGL_DRIVER): $(EGL_DRIVER)
+	@$(INSTALL) -d $(EGL_LIB_DIR)
+	$(INSTALL) $< $(EGL_LIB_DIR)
 
-egl_fbdev_$(EGL_DRIVER_NAME).so: $(EGL_DRIVER_OBJECTS) $(fbdev_ST) $(EGL_DRIVER_PIPES) $(GALLIUM_AUXILIARIES) Makefile
-	$(call mklib-egl,fbdev)
+$(EGL_DRIVER): $(EGL_DRIVER_OBJECTS) $(common_ST) $(EGL_DRIVER_PIPES) $(GALLIUM_AUXILIARIES) Makefile
+	$(MKLIB) -o $@ -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \
+		$(MKLIB_OPTIONS) $(EGL_DRIVER_OBJECTS) \
+		-Wl,--start-group $(common_ST) $(EGL_DRIVER_PIPES) \
+		$(GALLIUM_AUXILIARIES) -Wl,--end-group \
+		$(common_LIBS) $(EGL_DRIVER_LIBS) -L$(TOP)/$(LIB_DIR) -l$(EGL_LIB)
 
 clean:
 	-rm -f $(EGL_DRIVER_OBJECTS)
-	-rm -f $(EGL_PLATFORM_DRIVERS)
+	-rm -f $(EGL_DRIVER)
 
-install: $(EGL_PLATFORM_LIBS)
+install: $(EGL_LIB_DIR)/$(EGL_DRIVER)
 	$(INSTALL) -d $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR)
-	for lib in $(EGL_PLATFORM_LIBS); do \
-		$(MINSTALL) -m 755 "$$lib" $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR); \
-	done
+	$(MINSTALL) -m 755 $< $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR)
 
 depend:



More information about the mesa-commit mailing list