From f36d210c93b1fde0cdc5c6625ca2df25ad937aba Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 24 Jun 2011 10:39:06 +0900 Subject: [PATCH] targets/gbm: build pipe drivers Build pipe drivers here instead of using those built by the soon-to-be-removed targets/egl. [with an update by Benjamin Franzke to use --{start|end}-group] --- src/gallium/targets/gbm/Makefile | 126 ++++++++++++++++++++++++++++++++- src/gallium/targets/gbm/pipe_i915.c | 27 +++++++ src/gallium/targets/gbm/pipe_i965.c | 30 ++++++++ src/gallium/targets/gbm/pipe_loader.c | 6 +- src/gallium/targets/gbm/pipe_nouveau.c | 21 ++++++ src/gallium/targets/gbm/pipe_r300.c | 27 +++++++ src/gallium/targets/gbm/pipe_r600.c | 27 +++++++ src/gallium/targets/gbm/pipe_swrast.c | 22 ++++++ src/gallium/targets/gbm/pipe_vmwgfx.c | 27 +++++++ src/gbm/backends/Makefile.template | 10 +-- 10 files changed, 314 insertions(+), 9 deletions(-) create mode 100644 src/gallium/targets/gbm/pipe_i915.c create mode 100644 src/gallium/targets/gbm/pipe_i965.c create mode 100644 src/gallium/targets/gbm/pipe_nouveau.c create mode 100644 src/gallium/targets/gbm/pipe_r300.c create mode 100644 src/gallium/targets/gbm/pipe_r600.c create mode 100644 src/gallium/targets/gbm/pipe_swrast.c create mode 100644 src/gallium/targets/gbm/pipe_vmwgfx.c diff --git a/src/gallium/targets/gbm/Makefile b/src/gallium/targets/gbm/Makefile index 74a0232..2c096bc 100644 --- a/src/gallium/targets/gbm/Makefile +++ b/src/gallium/targets/gbm/Makefile @@ -24,9 +24,133 @@ GBM_LIBS = $(LIBUDEV_LIBS) $(LIBDRM_LIB) \ GBM_CFLAGS = \ - -D_EGL_GALLIUM_DRIVER_SEARCH_DIR=\"$(EGL_DRIVER_INSTALL_DIR)\" \ + -DGBM_BACKEND_SEARCH_DIR=\"$(GBM_BACKEND_INSTALL_DIR)\" \ -DPIPE_PREFIX=\"$(PIPE_PREFIX)\" \ $(LIBUDEV_CFLAGS) \ $(LIBDRM_CFLAGS) + +pipe_INCLUDES = \ + -I$(TOP)/include \ + -I$(TOP)/src/gallium/auxiliary \ + -I$(TOP)/src/gallium/drivers \ + -I$(TOP)/src/gallium/include \ + -I$(TOP)/src/gallium/winsys + +pipe_LIBS = $(LIBDRM_LIB) \ + $(TOP)/src/gallium/drivers/identity/libidentity.a \ + $(TOP)/src/gallium/drivers/trace/libtrace.a \ + $(TOP)/src/gallium/drivers/rbug/librbug.a \ + $(GALLIUM_AUXILIARIES) + +pipe_CLFLAGS = $(LIBDRM_CFLAGS) + +pipe_LDFLAGS = -Wl,--no-undefined + +# i915 pipe driver +i915_LIBS = -ldrm_intel \ + $(TOP)/src/gallium/winsys/i915/drm/libi915drm.a \ + $(TOP)/src/gallium/drivers/i915/libi915.a + +# i965 pipe driver +i965_LIBS = -ldrm_intel \ + $(TOP)/src/gallium/winsys/i965/drm/libi965drm.a \ + $(TOP)/src/gallium/drivers/i965/libi965.a \ + $(TOP)/src/gallium/winsys/sw/wrapper/libwsw.a + +# nouveau pipe driver +nouveau_LIBS = -ldrm_nouveau \ + $(TOP)/src/gallium/winsys/nouveau/drm/libnouveaudrm.a \ + $(TOP)/src/gallium/drivers/nvfx/libnvfx.a \ + $(TOP)/src/gallium/drivers/nv50/libnv50.a \ + $(TOP)/src/gallium/drivers/nvc0/libnvc0.a \ + $(TOP)/src/gallium/drivers/nouveau/libnouveau.a + +# r300 pipe driver +r300_LIBS = -ldrm \ + $(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \ + $(TOP)/src/gallium/drivers/r300/libr300.a + +# r600 pipe driver +r600_LIBS = -ldrm -ldrm_radeon \ + $(TOP)/src/gallium/winsys/r600/drm/libr600winsys.a \ + $(TOP)/src/gallium/drivers/r600/libr600.a + +# vmwgfx pipe driver +vmwgfx_LIBS = \ + $(TOP)/src/gallium/winsys/svga/drm/libsvgadrm.a \ + $(TOP)/src/gallium/drivers/svga/libsvga.a + +# LLVM +ifeq ($(MESA_LLVM),1) +pipe_LIBS += $(LLVM_LIBS) +pipe_LDFLAGS += $(LLVM_LDFLAGS) +endif + +# determine the targets/sources +pipe_TARGETS = +pipe_SOURCES = + +ifneq ($(findstring i915/drm,$(GALLIUM_WINSYS_DIRS)),) +pipe_TARGETS += $(PIPE_PREFIX)i915.so +pipe_SOURCES += pipe_i915.c +endif + +ifneq ($(findstring i965/drm,$(GALLIUM_WINSYS_DIRS)),) +pipe_TARGETS += $(PIPE_PREFIX)i965.so +pipe_SOURCES += pipe_i965.c +endif + +ifneq ($(findstring nouveau/drm,$(GALLIUM_WINSYS_DIRS)),) +pipe_TARGETS += $(PIPE_PREFIX)nouveau.so +pipe_SOURCES += pipe_nouveau.c +endif + +ifneq ($(findstring radeon/drm,$(GALLIUM_WINSYS_DIRS)),) +pipe_TARGETS += $(PIPE_PREFIX)r300.so +pipe_SOURCES += pipe_r300.c +endif + +ifneq ($(findstring r600/drm,$(GALLIUM_WINSYS_DIRS)),) +pipe_TARGETS += $(PIPE_PREFIX)r600.so +pipe_SOURCES += pipe_r600.c +endif + +ifneq ($(findstring svga/drm,$(GALLIUM_WINSYS_DIRS)),) +pipe_TARGETS += $(PIPE_PREFIX)vmwgfx.so +pipe_SOURCES += pipe_vmwgfx.c +endif + +pipe_OBJECTS = $(pipe_SOURCES:.c=.o) + + +GBM_EXTRA_TARGETS = $(addprefix $(TOP)/$(LIB_DIR)/gbm/, $(pipe_TARGETS)) +GBM_EXTRA_INSTALL = install-pipes +GBM_EXTRA_CLEAN = clean-pipes +GBM_EXTRA_SOURCES = $(pipe_SOURCES) + include $(TOP)/src/gbm/backends/Makefile.template + + +$(GBM_EXTRA_TARGETS): $(TOP)/$(LIB_DIR)/gbm/%: % + @$(INSTALL) -d $(dir $@) + $(INSTALL) $< $(dir $@) + +$(pipe_TARGETS): $(PIPE_PREFIX)%.so: pipe_%.o + $(MKLIB) -o $@ -noprefix -linker '$(CC)' \ + -ldflags '-L$(TOP)/$(LIB_DIR) $(pipe_LDFLAGS) $(LDFLAGS)' \ + $(MKLIB_OPTIONS) $< \ + -Wl,--start-group $($*_LIBS) $(pipe_LIBS) -Wl,--end-group + +$(pipe_OBJECTS): %.o: %.c + $(CC) -c -o $@ $< $(pipe_INCLUDES) $(pipe_CFLAGS) $(CFLAGS) + +install-pipes: $(GBM_EXTRA_TARGETS) + $(INSTALL) -d $(DESTDIR)$(GBM_BACKEND_INSTALL_DIR) + for tgt in $(GBM_EXTRA_TARGETS); do \ + $(MINSTALL) "$$tgt" $(DESTDIR)$(GBM_BACKEND_INSTALL_DIR); \ + done + +clean-pipes: + rm -f $(pipe_TARGETS) + rm -f $(pipe_OBJECTS) diff --git a/src/gallium/targets/gbm/pipe_i915.c b/src/gallium/targets/gbm/pipe_i915.c new file mode 100644 index 0000000..cd74044 --- /dev/null +++ b/src/gallium/targets/gbm/pipe_i915.c @@ -0,0 +1,27 @@ + +#include "target-helpers/inline_debug_helper.h" +#include "state_tracker/drm_driver.h" +#include "i915/drm/i915_drm_public.h" +#include "i915/i915_public.h" + +static struct pipe_screen * +create_screen(int fd) +{ + struct i915_winsys *iws; + struct pipe_screen *screen; + + iws = i915_drm_winsys_create(fd); + if (!iws) + return NULL; + + screen = i915_screen_create(iws); + if (!screen) + return NULL; + + screen = debug_screen_wrap(screen); + + return screen; +} + +PUBLIC +DRM_DRIVER_DESCRIPTOR("i915", "i915", create_screen) diff --git a/src/gallium/targets/gbm/pipe_i965.c b/src/gallium/targets/gbm/pipe_i965.c new file mode 100644 index 0000000..f810ecf --- /dev/null +++ b/src/gallium/targets/gbm/pipe_i965.c @@ -0,0 +1,30 @@ + +#include "target-helpers/inline_debug_helper.h" +#include "target-helpers/inline_wrapper_sw_helper.h" +#include "state_tracker/drm_driver.h" +#include "i965/drm/i965_drm_public.h" +#include "i965/brw_public.h" + +static struct pipe_screen * +create_screen(int fd) +{ + struct brw_winsys_screen *bws; + struct pipe_screen *screen; + + bws = i965_drm_winsys_screen_create(fd); + if (!bws) + return NULL; + + screen = brw_screen_create(bws); + if (!screen) + return NULL; + + screen = sw_screen_wrap(screen); + + screen = debug_screen_wrap(screen); + + return screen; +} + +PUBLIC +DRM_DRIVER_DESCRIPTOR("i965", "i965", create_screen) diff --git a/src/gallium/targets/gbm/pipe_loader.c b/src/gallium/targets/gbm/pipe_loader.c index 472614c..6200541 100644 --- a/src/gallium/targets/gbm/pipe_loader.c +++ b/src/gallium/targets/gbm/pipe_loader.c @@ -107,11 +107,11 @@ find_pipe_module(struct pipe_module *pmod, const char *name) search_paths = NULL; if (geteuid() == getuid()) { - /* don't allow setuid apps to use EGL_DRIVERS_PATH */ - search_paths = getenv("EGL_DRIVERS_PATH"); + /* don't allow setuid apps to use GBM_BACKENDS_PATH */ + search_paths = getenv("GBM_BACKENDS_PATH"); } if (search_paths == NULL) - search_paths = _EGL_GALLIUM_DRIVER_SEARCH_DIR; + search_paths = GBM_BACKEND_SEARCH_DIR; end = search_paths + strlen(search_paths); for (p = search_paths; p < end && pmod->lib == NULL; p = next + 1) { diff --git a/src/gallium/targets/gbm/pipe_nouveau.c b/src/gallium/targets/gbm/pipe_nouveau.c new file mode 100644 index 0000000..0c9081b --- /dev/null +++ b/src/gallium/targets/gbm/pipe_nouveau.c @@ -0,0 +1,21 @@ + +#include "target-helpers/inline_debug_helper.h" +#include "state_tracker/drm_driver.h" +#include "nouveau/drm/nouveau_drm_public.h" + +static struct pipe_screen * +create_screen(int fd) +{ + struct pipe_screen *screen; + + screen = nouveau_drm_screen_create(fd); + if (!screen) + return NULL; + + screen = debug_screen_wrap(screen); + + return screen; +} + +PUBLIC +DRM_DRIVER_DESCRIPTOR("nouveau", "nouveau", create_screen) diff --git a/src/gallium/targets/gbm/pipe_r300.c b/src/gallium/targets/gbm/pipe_r300.c new file mode 100644 index 0000000..09940f0 --- /dev/null +++ b/src/gallium/targets/gbm/pipe_r300.c @@ -0,0 +1,27 @@ + +#include "target-helpers/inline_debug_helper.h" +#include "state_tracker/drm_driver.h" +#include "radeon/drm/radeon_drm_public.h" +#include "r300/r300_public.h" + +static struct pipe_screen * +create_screen(int fd) +{ + struct radeon_winsys *sws; + struct pipe_screen *screen; + + sws = radeon_drm_winsys_create(fd); + if (!sws) + return NULL; + + screen = r300_screen_create(sws); + if (!screen) + return NULL; + + screen = debug_screen_wrap(screen); + + return screen; +} + +PUBLIC +DRM_DRIVER_DESCRIPTOR("r300", "radeon", create_screen) diff --git a/src/gallium/targets/gbm/pipe_r600.c b/src/gallium/targets/gbm/pipe_r600.c new file mode 100644 index 0000000..486a659 --- /dev/null +++ b/src/gallium/targets/gbm/pipe_r600.c @@ -0,0 +1,27 @@ + +#include "state_tracker/drm_driver.h" +#include "target-helpers/inline_debug_helper.h" +#include "r600/drm/r600_drm_public.h" +#include "r600/r600_public.h" + +static struct pipe_screen * +create_screen(int fd) +{ + struct radeon *rw; + struct pipe_screen *screen; + + rw = r600_drm_winsys_create(fd); + if (!rw) + return NULL; + + screen = r600_screen_create(rw); + if (!screen) + return NULL; + + screen = debug_screen_wrap(screen); + + return screen; +} + +PUBLIC +DRM_DRIVER_DESCRIPTOR("r600", "radeon", create_screen) diff --git a/src/gallium/targets/gbm/pipe_swrast.c b/src/gallium/targets/gbm/pipe_swrast.c new file mode 100644 index 0000000..b2e3289 --- /dev/null +++ b/src/gallium/targets/gbm/pipe_swrast.c @@ -0,0 +1,22 @@ + +#include "target-helpers/inline_sw_helper.h" +#include "target-helpers/inline_debug_helper.h" +#include "state_tracker/drm_driver.h" + +PUBLIC struct pipe_screen * +swrast_create_screen(struct sw_winsys *ws); + +PUBLIC +DRM_DRIVER_DESCRIPTOR("swrast", NULL, NULL) + +struct pipe_screen * +swrast_create_screen(struct sw_winsys *ws) +{ + struct pipe_screen *screen; + + screen = sw_screen_create(ws); + if (screen) + screen = debug_screen_wrap(screen); + + return screen; +} diff --git a/src/gallium/targets/gbm/pipe_vmwgfx.c b/src/gallium/targets/gbm/pipe_vmwgfx.c new file mode 100644 index 0000000..22a28fa --- /dev/null +++ b/src/gallium/targets/gbm/pipe_vmwgfx.c @@ -0,0 +1,27 @@ + +#include "target-helpers/inline_debug_helper.h" +#include "state_tracker/drm_driver.h" +#include "svga/drm/svga_drm_public.h" +#include "svga/svga_public.h" + +static struct pipe_screen * +create_screen(int fd) +{ + struct svga_winsys_screen *sws; + struct pipe_screen *screen; + + sws = svga_drm_winsys_screen_create(fd); + if (!sws) + return NULL; + + screen = svga_screen_create(sws); + if (!screen) + return NULL; + + screen = debug_screen_wrap(screen); + + return screen; +} + +PUBLIC +DRM_DRIVER_DESCRIPTOR("vmwgfx", "vmwgfx", create_screen) diff --git a/src/gbm/backends/Makefile.template b/src/gbm/backends/Makefile.template index 90b239a..851e5c5 100644 --- a/src/gbm/backends/Makefile.template +++ b/src/gbm/backends/Makefile.template @@ -24,7 +24,7 @@ GBM_TARGET = $(GBM_BACKEND_PATH) GBM_INSTALL = install-so endif -default: depend $(GBM_TARGET) +default: depend $(GBM_TARGET) $(GBM_EXTRA_TARGETS) $(GBM_BACKEND_PATH): $(GBM_BACKEND).so @$(INSTALL) -d $(TOP)/$(LIB_DIR)/gbm @@ -46,20 +46,20 @@ install-so: $(GBM_BACKEND_PATH) $(INSTALL) -d $(DESTDIR)$(GBM_BACKEND_INSTALL_DIR) $(MINSTALL) $(GBM_BACKEND_PATH) $(DESTDIR)$(GBM_BACKEND_INSTALL_DIR) -install: $(GBM_INSTALL) +install: $(GBM_INSTALL) $(GBM_EXTRA_INSTALL) -clean: +clean: $(GBM_EXTRA_CLEAN) rm -f $(GBM_BACKEND).so rm -f lib$(GBM_BACKEND).a rm -f $(GBM_OBJECTS) rm -f depend depend.bak -depend: $(GBM_SOURCES) +depend: $(GBM_SOURCES) $(GBM_EXTRA_SOURCES) @ echo "running $(MKDEP)" @ rm -f depend @ touch depend $(MKDEP) $(MKDEP_OPTIONS) $(GBM_INCLUDES) $(GBM_SOURCES) \ - >/dev/null 2>/dev/null + $(GBM_EXTRA_SOURCES) >/dev/null 2>/dev/null sinclude depend # DO NOT DELETE -- 2.7.4