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.tags/mesa-7.9-rc1
@@ -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: |
@@ -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', |
@@ -14,6 +14,62 @@ | |||
#include "egllog.h" | |||
/** | |||
* 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. | |||
*/ |
@@ -101,6 +101,10 @@ struct _egl_display | |||
}; | |||
extern _EGLPlatformType | |||
_eglGetNativePlatform(void); | |||
extern void | |||
_eglFiniDisplay(void); | |||
@@ -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); | |||
@@ -580,16 +560,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. |
@@ -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); | |||
@@ -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 |
@@ -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', |
@@ -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; | |||
@@ -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; | |||
}; | |||
@@ -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_ */ |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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; |
@@ -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; |
@@ -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: |