diff options
Diffstat (limited to 'src/gallium/targets')
41 files changed, 3307 insertions, 1 deletions
| diff --git a/src/gallium/targets/Makefile.dri b/src/gallium/targets/Makefile.dri new file mode 100644 index 0000000000..6d9b81aa24 --- /dev/null +++ b/src/gallium/targets/Makefile.dri @@ -0,0 +1,105 @@ +# -*-makefile-*- + +MESA_MODULES = \ +	$(TOP)/src/mesa/libmesagallium.a \ +	$(GALLIUM_AUXILIARIES) + +COMMON_GALLIUM_SOURCES = \ +        $(TOP)/src/mesa/drivers/dri/common/utils.c \ +        $(TOP)/src/mesa/drivers/dri/common/vblank.c \ +        $(TOP)/src/mesa/drivers/dri/common/dri_util.c \ +        $(TOP)/src/mesa/drivers/dri/common/xmlconfig.c + +COMMON_SOURCES = $(COMMON_GALLIUM_SOURCES) \ +        $(TOP)/src/mesa/drivers/common/driverfuncs.c \ +        $(TOP)/src/mesa/drivers/dri/common/texmem.c \ +        $(TOP)/src/mesa/drivers/dri/common/drirenderbuffer.c + +COMMON_BM_SOURCES = \ +	$(TOP)/src/mesa/drivers/dri/common/dri_bufmgr.c \ +	$(TOP)/src/mesa/drivers/dri/common/dri_drmpool.c + +INCLUDES = $(SHARED_INCLUDES) $(EXPAT_INCLUDES) + +OBJECTS = \ +	$(C_SOURCES:.c=.o) \ +	$(ASM_SOURCES:.S=.o)  + + +### Include directories +SHARED_INCLUDES = \ +	-I. \ +	-I$(TOP)/src/mesa/drivers/dri/common \ +	-Iserver \ +	-I$(TOP)/include \ +	-I$(TOP)/include/GL/internal \ +	-I$(TOP)/src/gallium/include \ +	-I$(TOP)/src/gallium/auxiliary \ +	-I$(TOP)/src/gallium/drivers \ +	-I$(TOP)/src/gallium/winsys/common \ +	-I$(TOP)/src/mesa \ +	-I$(TOP)/src/mesa/main \ +	-I$(TOP)/src/mesa/glapi \ +	-I$(TOP)/src/mesa/math \ +	-I$(TOP)/src/mesa/transform \ +	-I$(TOP)/src/mesa/shader \ +	-I$(TOP)/src/mesa/swrast \ +	-I$(TOP)/src/mesa/swrast_setup \ +	-I$(TOP)/src/egl/main \ +	-I$(TOP)/src/egl/drivers/dri \ +	$(LIBDRM_CFLAGS) + + +##### RULES ##### + +.c.o: +	$(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ + +.S.o: +	$(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ + + +##### TARGETS ##### + +default: depend symlinks $(TOP)/$(LIB_DIR)/gallium/$(LIBNAME) + +$(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(PIPE_DRIVERS) Makefile \ +		$(TOP)/src/mesa/drivers/dri/Makefile.template $(TOP)/src/mesa/drivers/dri/common/dri_test.o +	$(MKLIB) -o $@.tmp -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \ +		$(OBJECTS) $(PIPE_DRIVERS) \ +                -Wl,--start-group $(MESA_MODULES) -Wl,--end-group \ +                 $(DRI_LIB_DEPS) $(DRIVER_EXTRAS) +	$(CC) -o $@.test $(TOP)/src/mesa/drivers/dri/common/dri_test.o $@.tmp $(DRI_LIB_DEPS) +	@rm -f $@.test +	mv -f $@.tmp $@ + +$(TOP)/$(LIB_DIR)/gallium: +	mkdir -p $@ + +$(TOP)/$(LIB_DIR)/gallium/$(LIBNAME): $(LIBNAME) $(TOP)/$(LIB_DIR)/gallium +	$(INSTALL) $(LIBNAME) $(TOP)/$(LIB_DIR)/gallium + +depend: $(C_SOURCES) $(ASM_SOURCES) $(SYMLINKS) +	rm -f depend +	touch depend +	$(MKDEP) $(MKDEP_OPTIONS) $(DRIVER_DEFINES) $(INCLUDES) $(C_SOURCES) \ +		$(ASM_SOURCES) 2> /dev/null + + +# Emacs tags +tags: +	etags `find . -name \*.[ch]` `find ../include` + + +# Remove .o and backup files +clean: +	-rm -f *.o */*.o *~ *.so *~ server/*.o $(SYMLINKS) +	-rm -f depend depend.bak + + +install: $(LIBNAME) +	$(INSTALL) -d $(DESTDIR)$(DRI_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(LIBNAME) $(DESTDIR)$(DRI_DRIVER_INSTALL_DIR) + + +include depend diff --git a/src/gallium/targets/Makefile.egl b/src/gallium/targets/Makefile.egl new file mode 100644 index 0000000000..30fced7e3c --- /dev/null +++ b/src/gallium/targets/Makefile.egl @@ -0,0 +1,64 @@ +# src/gallium/winsys/drm/Makefile.egl + +# The driver Makefile should define +# +#   EGL_DRIVER_NAME, the name of the driver +#   EGL_DRIVER_SOURCES, the sources of the driver +#   EGL_DRIVER_LIBS, extra libraries needed by the driver +#   EGL_DRIVER_PIPES, the pipe drivers of the driver +# +# before including this file. + +EGL_DRIVER_OBJECTS = $(EGL_DRIVER_SOURCES:.c=.o) + +common_LIBS = -ldrm -lm -ldl + +x11_ST = $(TOP)/src/gallium/state_trackers/egl/libeglx11.a \ +	 $(TOP)/src/gallium/winsys/sw/xlib/libws_xlib.a +x11_LIBS = $(common_LIBS) -lX11 -lXext -lXfixes + +kms_ST = $(TOP)/src/gallium/state_trackers/egl/libeglkms.a +kms_LIBS = $(common_LIBS) + +##### RULES ##### + +.c.o: +	$(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@ + + +##### TARGETS ##### + +EGL_DISPLAY_DRIVERS = $(foreach dpy, $(EGL_DISPLAYS), egl_$(dpy)_$(EGL_DRIVER_NAME).so) + +EGL_DISPLAY_LIBS = $(foreach drv, $(EGL_DISPLAY_DRIVERS), $(TOP)/$(LIB_DIR)/$(drv)) + +default: $(EGL_DISPLAY_LIBS) + +$(EGL_DISPLAY_LIBS): $(TOP)/$(LIB_DIR)/%.so: %.so +	$(INSTALL) $< $(TOP)/$(LIB_DIR) + +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) +endef + +egl_x11_$(EGL_DRIVER_NAME).so: $(EGL_DRIVER_OBJECTS) $(x11_ST) $(EGL_DRIVER_PIPES) $(GALLIUM_AUXILIARIES) Makefile +	$(call mklib-egl,x11) + +egl_kms_$(EGL_DRIVER_NAME).so: $(EGL_DRIVER_OBJECTS) $(kms_ST) $(EGL_DRIVER_PIPES) $(GALLIUM_AUXILIARIES) Makefile +	$(call mklib-egl,kms) + +clean: +	-rm -f $(EGL_DRIVER_OBJECTS) +	-rm -f $(EGL_DISPLAY_DRIVERS) + +install: $(EGL_DISPLAY_LIBS) +	$(INSTALL) -d $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR) +	for lib in $(EGL_DISPLAY_LIBS); do \ +		$(MINSTALL) -m 755 "$$lib" $(DESTDIR)$(EGL_DRIVER_INSTALL_DIR); \ +	done + +depend: diff --git a/src/gallium/targets/SConscript b/src/gallium/targets/SConscript index df62fc65fb..3864564688 100644 --- a/src/gallium/targets/SConscript +++ b/src/gallium/targets/SConscript @@ -14,3 +14,71 @@ if 'gdi' in env['winsys']:  	SConscript([  		'libgl-gdi/SConscript',  	]) + +if env['dri']: +	drienv = env.Clone() + +	drienv.Replace(CPPPATH = [ +		'#src/mesa/drivers/dri/common', +		'#include', +		'#include/GL/internal', +		'#src/gallium/include', +		'#src/gallium/auxiliary', +		'#src/gallium/drivers', +		'#src/mesa', +		'#src/mesa/main', +		'#src/mesa/glapi', +		'#src/mesa/math', +		'#src/mesa/transform', +		'#src/mesa/shader', +		'#src/mesa/swrast', +		'#src/mesa/swrast_setup', +		'#src/egl/main', +		'#src/egl/drivers/dri', +	]) + +	drienv.ParseConfig('pkg-config --cflags --libs libdrm') + +	COMMON_GALLIUM_SOURCES = [ +		'#src/mesa/drivers/dri/common/utils.c', +		'#src/mesa/drivers/dri/common/vblank.c', +		'#src/mesa/drivers/dri/common/dri_util.c', +		'#src/mesa/drivers/dri/common/xmlconfig.c', +	] + +	COMMON_BM_SOURCES = [ +		'#src/mesa/drivers/dri/common/dri_bufmgr.c', +		'#src/mesa/drivers/dri/common/dri_drmpool.c', +	] + +	Export([ +		'drienv', +		'COMMON_GALLIUM_SOURCES', +		'COMMON_BM_SOURCES', +	]) + +	if 'vmware' in env['winsys']: +		SConscript([ +			'dri-vmwgfx/SConscript', +		]) + +	if 'intel' in env['winsys']: +		SConscript([ +			'dri-i915/SConscript', +		]) + +	if 'i965' in env['winsys']: +		SConscript([ +			'dri-i965/SConscript', +		]) + +	if 'radeon' in env['winsys']: +		SConscript([ +			'dri-radeong/SConscript', +		]) + +if 'xorg' in env['statetrackers']: +	if 'vmware' in env['winsys']: +		SConscript([ +			'xorg-vmwgfx/SConscript', +		]) diff --git a/src/gallium/targets/dri-i915/Makefile b/src/gallium/targets/dri-i915/Makefile new file mode 100644 index 0000000000..facbcb1803 --- /dev/null +++ b/src/gallium/targets/dri-i915/Makefile @@ -0,0 +1,22 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +LIBNAME = i915_dri.so + +PIPE_DRIVERS = \ +	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \ +	$(TOP)/src/gallium/winsys/i915/drm/libinteldrm.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/identity/libidentity.a \ +	$(TOP)/src/gallium/drivers/i915/libi915.a + +C_SOURCES = \ +	$(COMMON_GALLIUM_SOURCES) \ +	$(DRIVER_SOURCES) + +include ../Makefile.dri + +DRI_LIB_DEPS += -ldrm_intel + +symlinks: diff --git a/src/gallium/targets/dri-i915/SConscript b/src/gallium/targets/dri-i915/SConscript new file mode 100644 index 0000000000..8d4ecefbe1 --- /dev/null +++ b/src/gallium/targets/dri-i915/SConscript @@ -0,0 +1,25 @@ +Import('*') + +if not 'i915' in env['drivers']: +    print 'warning: i915 pipe driver not built skipping i915_dri.so' +    Return() + +env = drienv.Clone() + +env.ParseConfig('pkg-config --cflags --libs libdrm_intel') + +env.Prepend(LIBS = [ +    st_dri, +    inteldrm, +    i915, +    trace, +    mesa, +    glsl, +    gallium +]) + +env.LoadableModule( +    target ='i915_dri.so', +    source = COMMON_GALLIUM_SOURCES, +    SHLIBPREFIX = '', +) diff --git a/src/gallium/targets/dri-i965/Makefile b/src/gallium/targets/dri-i965/Makefile new file mode 100644 index 0000000000..c622bbcaf6 --- /dev/null +++ b/src/gallium/targets/dri-i965/Makefile @@ -0,0 +1,24 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +LIBNAME = i965_dri.so + +PIPE_DRIVERS = \ +	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \ +	$(TOP)/src/gallium/winsys/i965/drm/libi965drm.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/winsys/sw/drm/libswdrm.a \ +	$(TOP)/src/gallium/winsys/sw/wrapper/libwsw.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/identity/libidentity.a \ +	$(TOP)/src/gallium/drivers/i965/libi965.a + +C_SOURCES = \ +	$(COMMON_GALLIUM_SOURCES) \ +	$(DRIVER_SOURCES) + +include ../Makefile.dri + +DRI_LIB_DEPS += -ldrm_intel + +symlinks: diff --git a/src/gallium/targets/dri-i965/SConscript b/src/gallium/targets/dri-i965/SConscript new file mode 100644 index 0000000000..3b37d8e1af --- /dev/null +++ b/src/gallium/targets/dri-i965/SConscript @@ -0,0 +1,23 @@ +Import('*') + +if not 'i965' in env['drivers']: +    print 'warning: i965 pipe driver not built skipping i965_dri.so' +    Return() + +env = drienv.Clone() + +env.ParseConfig('pkg-config --cflags --libs libdrm_intel') + +drivers = [ +    st_dri, +    i965drm, +    i965, +    trace, +] + +env.LoadableModule( +    target ='i965_dri.so', +    source = COMMON_GALLIUM_SOURCES, +    LIBS = drivers + mesa + gallium + env['LIBS'], +    SHLIBPREFIX = '', +) diff --git a/src/gallium/targets/dri-nouveau/Makefile b/src/gallium/targets/dri-nouveau/Makefile new file mode 100644 index 0000000000..9ba5e18ba7 --- /dev/null +++ b/src/gallium/targets/dri-nouveau/Makefile @@ -0,0 +1,21 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +LIBNAME = nouveau_dri.so + +PIPE_DRIVERS = \ +	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \ +	$(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/nouveau/libnouveau.a + +C_SOURCES = \ +	$(COMMON_GALLIUM_SOURCES) \ +	$(DRIVER_SOURCES) + +include ../Makefile.dri + +DRI_LIB_DEPS += $(shell pkg-config libdrm_nouveau --libs) + +symlinks: diff --git a/src/gallium/targets/dri-radeong/Makefile b/src/gallium/targets/dri-radeong/Makefile new file mode 100644 index 0000000000..ce25559e94 --- /dev/null +++ b/src/gallium/targets/dri-radeong/Makefile @@ -0,0 +1,21 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +LIBNAME = radeong_dri.so + +PIPE_DRIVERS = \ +	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \ +	$(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/r300/libr300.a + +C_SOURCES = \ +	$(COMMON_GALLIUM_SOURCES) \ +	$(DRIVER_SOURCES) + +include ../Makefile.dri + +DRI_LIB_DEPS += -ldrm_radeon + +symlinks: diff --git a/src/gallium/targets/dri-radeong/SConscript b/src/gallium/targets/dri-radeong/SConscript new file mode 100644 index 0000000000..bb3b5b9304 --- /dev/null +++ b/src/gallium/targets/dri-radeong/SConscript @@ -0,0 +1,21 @@ +Import('*') + +if not 'r300' in env['drivers']: +    print 'warning: r300 pipe driver not built skipping radeong_dri.so' +    Return() + +env = drienv.Clone() + +env.ParseConfig('pkg-config --cflags --libs libdrm_radeon') + +drivers = [ +    trace, +    softpipe, +    r300 +] + +env.SharedLibrary( +    target ='radeon_dri.so', +    source = COMMON_GALLIUM_SOURCES, +    LIBS = st_dri + radeonwinsys + mesa + drivers + gallium + env['LIBS'], +) diff --git a/src/gallium/targets/dri-vmwgfx/Makefile b/src/gallium/targets/dri-vmwgfx/Makefile new file mode 100644 index 0000000000..32edc46a3d --- /dev/null +++ b/src/gallium/targets/dri-vmwgfx/Makefile @@ -0,0 +1,17 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +LIBNAME = vmwgfx_dri.so + +PIPE_DRIVERS = \ +	$(TOP)/src/gallium/state_trackers/dri/libdridrm.a \ +	$(TOP)/src/gallium/winsys/svga/drm/libsvgadrm.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/svga/libsvga.a + +C_SOURCES = \ +	$(COMMON_GALLIUM_SOURCES) + +include ../Makefile.dri + +symlinks: diff --git a/src/gallium/targets/dri-vmwgfx/SConscript b/src/gallium/targets/dri-vmwgfx/SConscript new file mode 100644 index 0000000000..7d248e8a9c --- /dev/null +++ b/src/gallium/targets/dri-vmwgfx/SConscript @@ -0,0 +1,24 @@ +Import('*') + +if not 'svga' in env['drivers']: +    print 'warning: svga pipe driver not built skipping vmwgfx_dri.so' +    Return() + +env = drienv.Clone() + +drivers = [ +	trace, +	st_dri, +	svgadrm, +	svga, +	mesa, +	glsl, +	gallium, +] + +env.LoadableModule( +    target ='vmwgfx_dri.so', +    source = COMMON_GALLIUM_SOURCES, +    LIBS = drivers + mesa + gallium + env['LIBS'], +    SHLIBPREFIX = '', +) diff --git a/src/gallium/targets/egl-i915/Makefile b/src/gallium/targets/egl-i915/Makefile new file mode 100644 index 0000000000..6c2fc14d70 --- /dev/null +++ b/src/gallium/targets/egl-i915/Makefile @@ -0,0 +1,14 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +EGL_DRIVER_NAME = i915 +EGL_DRIVER_SOURCES = dummy.c +EGL_DRIVER_LIBS = -ldrm_intel + +EGL_DRIVER_PIPES = \ +	$(TOP)/src/gallium/winsys/i915/drm/libinteldrm.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/i915/libi915.a + +include ../Makefile.egl diff --git a/src/gallium/targets/egl-i915/dummy.c b/src/gallium/targets/egl-i915/dummy.c new file mode 100644 index 0000000000..3181d0ba7e --- /dev/null +++ b/src/gallium/targets/egl-i915/dummy.c @@ -0,0 +1,3 @@ +/* A poor man's --whole-archive for EGL drivers */ +void *_eglMain(void *); +void *_eglWholeArchive = (void *) _eglMain; diff --git a/src/gallium/targets/egl-i965/Makefile b/src/gallium/targets/egl-i965/Makefile new file mode 100644 index 0000000000..dfb3cc45a7 --- /dev/null +++ b/src/gallium/targets/egl-i965/Makefile @@ -0,0 +1,14 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +EGL_DRIVER_NAME = i965 +EGL_DRIVER_SOURCES = dummy.c +EGL_DRIVER_LIBS = -ldrm_intel + +EGL_DRIVER_PIPES = \ +	$(TOP)/src/gallium/winsys/i965/drm/libi965drm.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/i965/libi965.a + +include ../Makefile.egl diff --git a/src/gallium/targets/egl-i965/dummy.c b/src/gallium/targets/egl-i965/dummy.c new file mode 100644 index 0000000000..3181d0ba7e --- /dev/null +++ b/src/gallium/targets/egl-i965/dummy.c @@ -0,0 +1,3 @@ +/* A poor man's --whole-archive for EGL drivers */ +void *_eglMain(void *); +void *_eglWholeArchive = (void *) _eglMain; diff --git a/src/gallium/targets/egl-nouveau/Makefile b/src/gallium/targets/egl-nouveau/Makefile new file mode 100644 index 0000000000..3da93790f2 --- /dev/null +++ b/src/gallium/targets/egl-nouveau/Makefile @@ -0,0 +1,15 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +EGL_DRIVER_NAME = nouveau +EGL_DRIVER_SOURCES = dummy.c +EGL_DRIVER_LIBS = -ldrm_nouveau + +EGL_DRIVER_PIPES = \ +	$(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/nouveau/libnouveau.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a + +include ../Makefile.egl diff --git a/src/gallium/targets/egl-nouveau/dummy.c b/src/gallium/targets/egl-nouveau/dummy.c new file mode 100644 index 0000000000..3181d0ba7e --- /dev/null +++ b/src/gallium/targets/egl-nouveau/dummy.c @@ -0,0 +1,3 @@ +/* A poor man's --whole-archive for EGL drivers */ +void *_eglMain(void *); +void *_eglWholeArchive = (void *) _eglMain; diff --git a/src/gallium/targets/egl-radeon/Makefile b/src/gallium/targets/egl-radeon/Makefile new file mode 100644 index 0000000000..f55d84de81 --- /dev/null +++ b/src/gallium/targets/egl-radeon/Makefile @@ -0,0 +1,14 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +EGL_DRIVER_NAME = radeon +EGL_DRIVER_SOURCES = dummy.c +EGL_DRIVER_LIBS = -ldrm_radeon + +EGL_DRIVER_PIPES = \ +	$(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/r300/libr300.a + +include ../Makefile.egl diff --git a/src/gallium/targets/egl-radeon/dummy.c b/src/gallium/targets/egl-radeon/dummy.c new file mode 100644 index 0000000000..3181d0ba7e --- /dev/null +++ b/src/gallium/targets/egl-radeon/dummy.c @@ -0,0 +1,3 @@ +/* A poor man's --whole-archive for EGL drivers */ +void *_eglMain(void *); +void *_eglWholeArchive = (void *) _eglMain; diff --git a/src/gallium/targets/egl-swrast/Makefile b/src/gallium/targets/egl-swrast/Makefile new file mode 100644 index 0000000000..937343defe --- /dev/null +++ b/src/gallium/targets/egl-swrast/Makefile @@ -0,0 +1,12 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +# Do propperly +CFLAGS+="-I$(TOP)/src/gallium/include" + +EGL_DRIVER_NAME = swrast +EGL_DRIVER_SOURCES = swrast_glue.c +EGL_DRIVER_LIBS = +EGL_DRIVER_PIPES = $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a + +include ../Makefile.egl diff --git a/src/gallium/targets/egl-swrast/swrast_glue.c b/src/gallium/targets/egl-swrast/swrast_glue.c new file mode 100644 index 0000000000..9db8089a66 --- /dev/null +++ b/src/gallium/targets/egl-swrast/swrast_glue.c @@ -0,0 +1,17 @@ +#include "state_tracker/drm_api.h" + +static struct drm_api swrast_drm_api = +{ +   .name = "swrast", +}; + +struct drm_api * +drm_api_create() +{ +   (void) swrast_drm_api; +   return NULL; +} + +/* A poor man's --whole-archive for EGL drivers */ +void *_eglMain(void *); +void *_eglWholeArchive = (void *) _eglMain; diff --git a/src/gallium/targets/egl-vmwgfx/Makefile b/src/gallium/targets/egl-vmwgfx/Makefile new file mode 100644 index 0000000000..6db12e03a7 --- /dev/null +++ b/src/gallium/targets/egl-vmwgfx/Makefile @@ -0,0 +1,14 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +EGL_DRIVER_NAME = vmwgfx +EGL_DRIVER_SOURCES = dummy.c +EGL_DRIVER_LIBS = + +EGL_DRIVER_PIPES = \ +	$(TOP)/src/gallium/winsys/svga/drm/libsvgadrm.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/svga/libsvga.a + +include ../Makefile.egl diff --git a/src/gallium/targets/egl-vmwgfx/dummy.c b/src/gallium/targets/egl-vmwgfx/dummy.c new file mode 100644 index 0000000000..3181d0ba7e --- /dev/null +++ b/src/gallium/targets/egl-vmwgfx/dummy.c @@ -0,0 +1,3 @@ +/* A poor man's --whole-archive for EGL drivers */ +void *_eglMain(void *); +void *_eglWholeArchive = (void *) _eglMain; diff --git a/src/gallium/targets/libgl-xlib/Makefile b/src/gallium/targets/libgl-xlib/Makefile index 5a4e035c2e..6cd00cad45 100644 --- a/src/gallium/targets/libgl-xlib/Makefile +++ b/src/gallium/targets/libgl-xlib/Makefile @@ -38,7 +38,7 @@ XLIB_TARGET_OBJECTS = $(XLIB_TARGET_SOURCES:.c=.o)  LIBS = \  	$(GALLIUM_DRIVERS) \  	$(TOP)/src/gallium/state_trackers/glx/xlib/libxlib.a \ -	$(TOP)/src/gallium/winsys/xlib/libws_xlib.a \ +	$(TOP)/src/gallium/winsys/sw/xlib/libws_xlib.a \  	$(TOP)/src/gallium/drivers/trace/libtrace.a \  	$(TOP)/src/gallium/drivers/identity/libidentity.a \  	$(TOP)/src/mesa/libglapi.a \ diff --git a/src/gallium/targets/xorg-i915/Makefile b/src/gallium/targets/xorg-i915/Makefile new file mode 100644 index 0000000000..e2cffcd70b --- /dev/null +++ b/src/gallium/targets/xorg-i915/Makefile @@ -0,0 +1,57 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +TARGET     = modesetting_drv.so +CFILES     = $(wildcard ./*.c) +OBJECTS    = $(patsubst ./%.c,./%.o,$(CFILES)) + +INCLUDES = \ +	$(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto) \ +	-I$(TOP)/src/gallium/winsys/drm/intel/gem \ +	-I$(TOP)/src/gallium/include \ +	-I$(TOP)/src/gallium/drivers \ +	-I$(TOP)/src/gallium/auxiliary \ +	-I$(TOP)/src/mesa \ +	-I$(TOP)/include \ +	-I$(TOP)/src/egl/main + +LIBS = \ +	$(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a \ +	$(TOP)/src/gallium/winsys/i915/drm/libinteldrm.a \ +	$(TOP)/src/gallium/drivers/i915/libi915.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(GALLIUM_AUXILIARIES) + +DRIVER_DEFINES = \ +	-DHAVE_CONFIG_H + + +############################################# + + + +all default: $(TARGET) + +$(TARGET): $(OBJECTS) Makefile $(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a $(LIBS) +	$(TOP)/bin/mklib -noprefix -o $@ \ +	$(OBJECTS) $(LIBS) $(shell pkg-config --libs libdrm) -ldrm_intel + +clean: +	rm -rf $(OBJECTS) $(TARGET) + +install: +	$(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) + + +############################################## + + +.c.o: +	$(CC) -c $(CFLAGS) $(INCLUDES) $(DRIVER_DEFINES) $< -o $@ + + +############################################## + +.PHONY	= all clean install diff --git a/src/gallium/targets/xorg-i915/intel_xorg.c b/src/gallium/targets/xorg-i915/intel_xorg.c new file mode 100644 index 0000000000..08f3b08863 --- /dev/null +++ b/src/gallium/targets/xorg-i915/intel_xorg.c @@ -0,0 +1,147 @@ +/* + * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + * Author: Alan Hourihane <alanh@tungstengraphics.com> + * Author: Jakob Bornecrantz <wallbraker@gmail.com> + * + */ + +#include "../../state_trackers/xorg/xorg_winsys.h" + +static void intel_xorg_identify(int flags); +static Bool intel_xorg_pci_probe(DriverPtr driver, +				 int entity_num, +				 struct pci_device *device, +				 intptr_t match_data); + +static const struct pci_id_match intel_xorg_device_match[] = { +    {0x8086, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 0}, +    {0, 0, 0}, +}; + +static SymTabRec intel_xorg_chipsets[] = { +    {PCI_MATCH_ANY, "Intel Graphics Device"}, +    {-1, NULL} +}; + +static PciChipsets intel_xorg_pci_devices[] = { +    {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL}, +    {-1, -1, NULL} +}; + +static XF86ModuleVersionInfo intel_xorg_version = { +    "modesetting", +    MODULEVENDORSTRING, +    MODINFOSTRING1, +    MODINFOSTRING2, +    XORG_VERSION_CURRENT, +    0, 1, 0, /* major, minor, patch */ +    ABI_CLASS_VIDEODRV, +    ABI_VIDEODRV_VERSION, +    MOD_CLASS_VIDEODRV, +    {0, 0, 0, 0} +}; + +/* + * Xorg driver exported structures + */ + +_X_EXPORT DriverRec modesetting = { +    1, +    "modesetting", +    intel_xorg_identify, +    NULL, +    xorg_tracker_available_options, +    NULL, +    0, +    NULL, +    intel_xorg_device_match, +    intel_xorg_pci_probe +}; + +static MODULESETUPPROTO(intel_xorg_setup); + +_X_EXPORT XF86ModuleData modesettingModuleData = { +    &intel_xorg_version, +    intel_xorg_setup, +    NULL +}; + +/* + * Xorg driver functions + */ + +static pointer +intel_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin) +{ +    static Bool setupDone = 0; + +    /* This module should be loaded only once, but check to be sure. +     */ +    if (!setupDone) { +	setupDone = 1; +	xf86AddDriver(&modesetting, module, HaveDriverFuncs); + +	/* +	 * The return value must be non-NULL on success even though there +	 * is no TearDownProc. +	 */ +	return (pointer) 1; +    } else { +	if (errmaj) +	    *errmaj = LDR_ONCEONLY; +	return NULL; +    } +} + +static void +intel_xorg_identify(int flags) +{ +    xf86PrintChipsets("modesetting", "Driver for Modesetting Kernel Drivers", +		      intel_xorg_chipsets); +} + +static Bool +intel_xorg_pci_probe(DriverPtr driver, +	  int entity_num, struct pci_device *device, intptr_t match_data) +{ +    ScrnInfoPtr scrn = NULL; +    EntityInfoPtr entity; + +    scrn = xf86ConfigPciEntity(scrn, 0, entity_num, intel_xorg_pci_devices, +			       NULL, NULL, NULL, NULL, NULL); +    if (scrn != NULL) { +	scrn->driverVersion = 1; +	scrn->driverName = "i915"; +	scrn->name = "modesetting"; +	scrn->Probe = NULL; + +	entity = xf86GetEntityInfo(entity_num); + +	/* Use all the functions from the xorg tracker */ +	xorg_tracker_set_functions(scrn); +    } +    return scrn != NULL; +} diff --git a/src/gallium/targets/xorg-i965/Makefile b/src/gallium/targets/xorg-i965/Makefile new file mode 100644 index 0000000000..104a1434a8 --- /dev/null +++ b/src/gallium/targets/xorg-i965/Makefile @@ -0,0 +1,48 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +TARGET     = i965g_drv.so +CFILES     = $(wildcard ./*.c) +OBJECTS    = $(patsubst ./%.c,./%.o,$(CFILES)) + +CFLAGS = -DHAVE_CONFIG_H \ +         -g -Wall -Wimplicit-function-declaration -fPIC \ +         $(shell pkg-config --cflags pixman-1 xorg-server libdrm xproto) \ +         -I$(TOP)/src/gallium/include \ +         -I$(TOP)/src/gallium/drivers \ +         -I$(TOP)/src/gallium/auxiliary \ +         -I$(TOP)/src/mesa \ +         -I$(TOP)/include \ +         -I$(TOP)/src/egl/main + +LIBS = \ +	$(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a \ +	$(TOP)/src/gallium/winsys/i965/drm/libi965drm.a \ +	$(TOP)/src/gallium/drivers/i965/libi965.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(GALLIUM_AUXILIARIES) + +TARGET_STAGING = $(TOP)/$(LIB_DIR)/gallium/$(TARGET) +############################################# + +all default: $(TARGET) $(TARGET_STAGING) + +$(TARGET): $(OBJECTS) Makefile $(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a $(LIBS) +	$(TOP)/bin/mklib -noprefix -o $@ \ +	$(OBJECTS) $(LIBS) $(shell pkg-config --libs libdrm) -ldrm_intel + +$(TOP)/$(LIB_DIR)/gallium: +	mkdir -p $@ + +$(TARGET_STAGING): $(TARGET) $(TOP)/$(LIB_DIR)/gallium +	$(INSTALL) $(TARGET) $(TOP)/$(LIB_DIR)/gallium + +clean: +	rm -rf $(OBJECTS) $(TARGET) + +install: +	$(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) + +.PHONY	= all clean install diff --git a/src/gallium/targets/xorg-i965/intel_xorg.c b/src/gallium/targets/xorg-i965/intel_xorg.c new file mode 100644 index 0000000000..f4608f0eb4 --- /dev/null +++ b/src/gallium/targets/xorg-i965/intel_xorg.c @@ -0,0 +1,147 @@ +/* + * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + * Author: Alan Hourihane <alanh@tungstengraphics.com> + * Author: Jakob Bornecrantz <wallbraker@gmail.com> + * + */ + +#include "../../state_trackers/xorg/xorg_winsys.h" + +static void intel_xorg_identify(int flags); +static Bool intel_xorg_pci_probe(DriverPtr driver, +				 int entity_num, +				 struct pci_device *device, +				 intptr_t match_data); + +static const struct pci_id_match intel_xorg_device_match[] = { +    {0x8086, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 0}, +    {0, 0, 0}, +}; + +static SymTabRec intel_xorg_chipsets[] = { +    {PCI_MATCH_ANY, "Intel Graphics Device"}, +    {-1, NULL} +}; + +static PciChipsets intel_xorg_pci_devices[] = { +    {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL}, +    {-1, -1, NULL} +}; + +static XF86ModuleVersionInfo intel_xorg_version = { +    "modesetting", +    MODULEVENDORSTRING, +    MODINFOSTRING1, +    MODINFOSTRING2, +    XORG_VERSION_CURRENT, +    0, 1, 0, /* major, minor, patch */ +    ABI_CLASS_VIDEODRV, +    ABI_VIDEODRV_VERSION, +    MOD_CLASS_VIDEODRV, +    {0, 0, 0, 0} +}; + +/* + * Xorg driver exported structures + */ + +_X_EXPORT DriverRec modesetting = { +    1, +    "modesetting", +    intel_xorg_identify, +    NULL, +    xorg_tracker_available_options, +    NULL, +    0, +    NULL, +    intel_xorg_device_match, +    intel_xorg_pci_probe +}; + +static MODULESETUPPROTO(intel_xorg_setup); + +_X_EXPORT XF86ModuleData modesettingModuleData = { +    &intel_xorg_version, +    intel_xorg_setup, +    NULL +}; + +/* + * Xorg driver functions + */ + +static pointer +intel_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin) +{ +    static Bool setupDone = 0; + +    /* This module should be loaded only once, but check to be sure. +     */ +    if (!setupDone) { +	setupDone = 1; +	xf86AddDriver(&modesetting, module, HaveDriverFuncs); + +	/* +	 * The return value must be non-NULL on success even though there +	 * is no TearDownProc. +	 */ +	return (pointer) 1; +    } else { +	if (errmaj) +	    *errmaj = LDR_ONCEONLY; +	return NULL; +    } +} + +static void +intel_xorg_identify(int flags) +{ +    xf86PrintChipsets("modesetting", "Driver for Modesetting Kernel Drivers", +		      intel_xorg_chipsets); +} + +static Bool +intel_xorg_pci_probe(DriverPtr driver, +	  int entity_num, struct pci_device *device, intptr_t match_data) +{ +    ScrnInfoPtr scrn = NULL; +    EntityInfoPtr entity; + +    scrn = xf86ConfigPciEntity(scrn, 0, entity_num, intel_xorg_pci_devices, +			       NULL, NULL, NULL, NULL, NULL); +    if (scrn != NULL) { +	scrn->driverVersion = 1; +	scrn->driverName = "i965"; +	scrn->name = "modesetting"; +	scrn->Probe = NULL; + +	entity = xf86GetEntityInfo(entity_num); + +	/* Use all the functions from the xorg tracker */ +	xorg_tracker_set_functions(scrn); +    } +    return scrn != NULL; +} diff --git a/src/gallium/targets/xorg-nouveau/Makefile b/src/gallium/targets/xorg-nouveau/Makefile new file mode 100644 index 0000000000..b514b57000 --- /dev/null +++ b/src/gallium/targets/xorg-nouveau/Makefile @@ -0,0 +1,56 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +TARGET     = modesetting_drv.so +CFILES     = $(wildcard ./*.c) +OBJECTS    = $(patsubst ./%.c,./%.o,$(CFILES)) + +INCLUDES = \ +	$(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto) \ +	-I$(TOP)/src/gallium/include \ +	-I$(TOP)/src/gallium/drivers \ +	-I$(TOP)/src/gallium/auxiliary \ +	-I$(TOP)/src/mesa \ +	-I$(TOP)/include \ +	-I$(TOP)/src/egl/main + +LIBS = \ +	$(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a \ +	$(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/nouveau/libnouveau.a \ +	$(GALLIUM_AUXILIARIES) + +DRIVER_DEFINES = \ +	-DHAVE_CONFIG_H + + +############################################# + + + +all default: $(TARGET) + +$(TARGET): $(OBJECTS) Makefile $(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a $(LIBS) +	$(TOP)/bin/mklib -noprefix -o $@ \ +	$(OBJECTS) $(LIBS) $(shell pkg-config --libs libdrm) -ldrm_nouveau + +clean: +	rm -rf $(OBJECTS) $(TARGET) + +install: +	$(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) + + +############################################## + + +.c.o: +	$(CC) -c $(CFLAGS) $(INCLUDES) $(DRIVER_DEFINES) $< -o $@ + + +############################################## + +.PHONY	= all clean install diff --git a/src/gallium/targets/xorg-nouveau/nouveau_xorg.c b/src/gallium/targets/xorg-nouveau/nouveau_xorg.c new file mode 100644 index 0000000000..699af09029 --- /dev/null +++ b/src/gallium/targets/xorg-nouveau/nouveau_xorg.c @@ -0,0 +1,149 @@ +/* + * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + * Author: Alan Hourihane <alanh@tungstengraphics.com> + * Author: Jakob Bornecrantz <wallbraker@gmail.com> + * + */ + +#include "../../state_trackers/xorg/xorg_winsys.h" + +static void nouveau_xorg_identify(int flags); +static Bool nouveau_xorg_pci_probe(DriverPtr driver, int entity_num, +				   struct pci_device *device, +				   intptr_t match_data); + +static const struct pci_id_match nouveau_xorg_device_match[] = { +    { 0x10de, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, +      0x00030000, 0x00ffffff, 0 }, +    { 0x12d2, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, +      0x00030000, 0x00ffffff, 0 }, +    {0, 0, 0}, +}; + +static SymTabRec nouveau_xorg_chipsets[] = { +    {PCI_MATCH_ANY, "NVIDIA Graphics Device"}, +    {-1, NULL} +}; + +static PciChipsets nouveau_xorg_pci_devices[] = { +    {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL}, +    {-1, -1, NULL} +}; + +static XF86ModuleVersionInfo nouveau_xorg_version = { +    "modesetting", +    MODULEVENDORSTRING, +    MODINFOSTRING1, +    MODINFOSTRING2, +    XORG_VERSION_CURRENT, +    0, 1, 0, /* major, minor, patch */ +    ABI_CLASS_VIDEODRV, +    ABI_VIDEODRV_VERSION, +    MOD_CLASS_VIDEODRV, +    {0, 0, 0, 0} +}; + +/* + * Xorg driver exported structures + */ + +_X_EXPORT DriverRec modesetting = { +    1, +    "modesetting", +    nouveau_xorg_identify, +    NULL, +    xorg_tracker_available_options, +    NULL, +    0, +    NULL, +    nouveau_xorg_device_match, +    nouveau_xorg_pci_probe +}; + +static MODULESETUPPROTO(nouveau_xorg_setup); + +_X_EXPORT XF86ModuleData modesettingModuleData = { +    &nouveau_xorg_version, +    nouveau_xorg_setup, +    NULL +}; + +/* + * Xorg driver functions + */ + +static pointer +nouveau_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin) +{ +    static Bool setupDone = 0; + +    /* This module should be loaded only once, but check to be sure. +     */ +    if (!setupDone) { +	setupDone = 1; +	xf86AddDriver(&modesetting, module, HaveDriverFuncs); + +	/* +	 * The return value must be non-NULL on success even though there +	 * is no TearDownProc. +	 */ +	return (pointer) 1; +    } else { +	if (errmaj) +	    *errmaj = LDR_ONCEONLY; +	return NULL; +    } +} + +static void +nouveau_xorg_identify(int flags) +{ +    xf86PrintChipsets("modesetting", "Driver for Modesetting Kernel Drivers", +		      nouveau_xorg_chipsets); +} + +static Bool +nouveau_xorg_pci_probe(DriverPtr driver, +	  int entity_num, struct pci_device *device, intptr_t match_data) +{ +    ScrnInfoPtr scrn = NULL; +    EntityInfoPtr entity; + +    scrn = xf86ConfigPciEntity(scrn, 0, entity_num, nouveau_xorg_pci_devices, +			       NULL, NULL, NULL, NULL, NULL); +    if (scrn != NULL) { +	scrn->driverVersion = 1; +	scrn->driverName = "i915"; +	scrn->name = "modesetting"; +	scrn->Probe = NULL; + +	entity = xf86GetEntityInfo(entity_num); + +	/* Use all the functions from the xorg tracker */ +	xorg_tracker_set_functions(scrn); +    } +    return scrn != NULL; +} diff --git a/src/gallium/targets/xorg-radeon/Makefile b/src/gallium/targets/xorg-radeon/Makefile new file mode 100644 index 0000000000..cd32914c0d --- /dev/null +++ b/src/gallium/targets/xorg-radeon/Makefile @@ -0,0 +1,48 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +TARGET     = radeong_drv.so +CFILES     = $(wildcard ./*.c) +OBJECTS    = $(patsubst ./%.c,./%.o,$(CFILES)) + +CFLAGS = -DHAVE_CONFIG_H \ +         -g -Wall -Wimplicit-function-declaration -fPIC \ +         $(shell pkg-config --cflags pixman-1 xorg-server libdrm xproto) \ +         -I$(TOP)/src/gallium/include \ +         -I$(TOP)/src/gallium/drivers \ +         -I$(TOP)/src/gallium/auxiliary \ +         -I${TOP}/src/mesa \ +         -I$(TOP)/include \ +         -I$(TOP)/src/egl/main + +LIBS = \ +	$(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a \ +	$(TOP)/src/gallium/winsys/radeon/drm/libradeonwinsys.a \ +	$(TOP)/src/gallium/drivers/r300/libr300.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \ +	$(GALLIUM_AUXILIARIES) + +TARGET_STAGING = $(TOP)/$(LIB_DIR)/gallium/$(TARGET) +############################################# + +all default: $(TARGET) $(TARGET_STAGING) + +$(TARGET): $(OBJECTS) Makefile $(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a $(LIBS) +	$(TOP)/bin/mklib -noprefix -o $@ \ +	$(OBJECTS) $(LIBS) $(shell pkg-config --libs libdrm) -ldrm_radeon + +$(TOP)/$(LIB_DIR)/gallium: +	mkdir -p $@ + +$(TARGET_STAGING): $(TARGET) $(TOP)/$(LIB_DIR)/gallium +	$(INSTALL) $(TARGET) $(TOP)/$(LIB_DIR)/gallium + +clean: +	rm -rf $(OBJECTS) $(TARGET) + +install: +	$(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) + +.PHONY	= all clean install diff --git a/src/gallium/targets/xorg-radeon/radeon_xorg.c b/src/gallium/targets/xorg-radeon/radeon_xorg.c new file mode 100644 index 0000000000..0d6aa56722 --- /dev/null +++ b/src/gallium/targets/xorg-radeon/radeon_xorg.c @@ -0,0 +1,148 @@ +/* + * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * + * Author: Alan Hourihane <alanh@tungstengraphics.com> + * Author: Jakob Bornecrantz <wallbraker@gmail.com> + * Author: Corbin Simpson <MostAwesomedude@gmail.com> + * + */ + +#include "../../state_trackers/xorg/xorg_winsys.h" + +static void radeon_xorg_identify(int flags); +static Bool radeon_xorg_pci_probe(DriverPtr driver, +				 int entity_num, +				 struct pci_device *device, +				 intptr_t match_data); + +static const struct pci_id_match radeon_xorg_device_match[] = { +    {0x1002, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 0}, +    {0, 0, 0}, +}; + +static SymTabRec radeon_xorg_chipsets[] = { +    {PCI_MATCH_ANY, "ATI/AMD Radeon Graphics Chipset"}, +    {-1, NULL} +}; + +static PciChipsets radeon_xorg_pci_devices[] = { +    {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL}, +    {-1, -1, NULL} +}; + +static XF86ModuleVersionInfo radeon_xorg_version = { +    "radeong", +    MODULEVENDORSTRING, +    MODINFOSTRING1, +    MODINFOSTRING2, +    XORG_VERSION_CURRENT, +    0, 1, 0, /* major, minor, patch */ +    ABI_CLASS_VIDEODRV, +    ABI_VIDEODRV_VERSION, +    MOD_CLASS_VIDEODRV, +    {0, 0, 0, 0} +}; + +/* + * Xorg driver exported structures + */ + +_X_EXPORT DriverRec radeong = { +    1, +    "radeong", +    radeon_xorg_identify, +    NULL, +    xorg_tracker_available_options, +    NULL, +    0, +    NULL, +    radeon_xorg_device_match, +    radeon_xorg_pci_probe +}; + +static MODULESETUPPROTO(radeon_xorg_setup); + +_X_EXPORT XF86ModuleData radeongModuleData = { +    &radeon_xorg_version, +    radeon_xorg_setup, +    NULL +}; + +/* + * Xorg driver functions + */ + +static pointer +radeon_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin) +{ +    static Bool setupDone = 0; + +    /* This module should be loaded only once, but check to be sure. +     */ +    if (!setupDone) { +	setupDone = 1; +	xf86AddDriver(&radeong, module, HaveDriverFuncs); + +	/* +	 * The return value must be non-NULL on success even though there +	 * is no TearDownProc. +	 */ +	return (pointer) 1; +    } else { +	if (errmaj) +	    *errmaj = LDR_ONCEONLY; +	return NULL; +    } +} + +static void +radeon_xorg_identify(int flags) +{ +    xf86PrintChipsets("radeong", "Driver for Radeon Gallium with KMS", +		      radeon_xorg_chipsets); +} + +static Bool +radeon_xorg_pci_probe(DriverPtr driver, +	  int entity_num, struct pci_device *device, intptr_t match_data) +{ +    ScrnInfoPtr scrn = NULL; +    EntityInfoPtr entity; + +    scrn = xf86ConfigPciEntity(scrn, 0, entity_num, radeon_xorg_pci_devices, +			       NULL, NULL, NULL, NULL, NULL); +    if (scrn != NULL) { +	scrn->driverVersion = 1; +	scrn->driverName = "radeong"; +	scrn->name = "radeong"; +	scrn->Probe = NULL; + +	entity = xf86GetEntityInfo(entity_num); + +	/* Use all the functions from the xorg tracker */ +	xorg_tracker_set_functions(scrn); +    } +    return scrn != NULL; +} diff --git a/src/gallium/targets/xorg-vmwgfx/Makefile b/src/gallium/targets/xorg-vmwgfx/Makefile new file mode 100644 index 0000000000..12bc307ef9 --- /dev/null +++ b/src/gallium/targets/xorg-vmwgfx/Makefile @@ -0,0 +1,70 @@ +TOP = ../../../.. +include $(TOP)/configs/current + +TARGET = vmwgfx_drv.so + +CFILES = \ +	vmw_xorg.c \ +	vmw_video.c \ +	vmw_ioctl.c \ +	vmw_screen.c + +OBJECTS = $(patsubst %.c,%.o,$(CFILES)) + +INCLUDES = \ +	$(shell pkg-config --cflags-only-I pixman-1 xorg-server libdrm xproto) \ +	-I$(TOP)/src/gallium/include \ +	-I$(TOP)/src/gallium/drivers \ +	-I$(TOP)/src/gallium/auxiliary \ +	-I$(TOP)/src/gallium + +LIBS = \ +	$(TOP)/src/gallium/state_trackers/xorg/libxorgtracker.a \ +	$(TOP)/src/gallium/winsys/svga/drm/libsvgadrm.a \ +	$(TOP)/src/gallium/drivers/trace/libtrace.a \ +	$(TOP)/src/gallium/drivers/svga/libsvga.a \ +	$(GALLIUM_AUXILIARIES) + +LINKS = \ +	$(shell pkg-config --libs --silence-errors libkms) \ +	$(shell pkg-config --libs libdrm) + +DRIVER_DEFINES = \ +	-std=gnu99 \ +	-DHAVE_CONFIG_H + +TARGET_STAGING = $(TOP)/$(LIB_DIR)/gallium/$(TARGET) + +############################################# + + + +all default: $(TARGET) $(TARGET_STAGING) + +$(TARGET): $(OBJECTS) Makefile $(LIBS) +	$(MKLIB) -noprefix -o $@ $(OBJECTS) $(LIBS) $(LINKS) + +$(TOP)/$(LIB_DIR)/gallium: +	mkdir -p $@ + +$(TARGET_STAGING): $(TARGET) $(TOP)/$(LIB_DIR)/gallium +	$(INSTALL) $(TARGET) $(TOP)/$(LIB_DIR)/gallium + +clean: +	rm -rf $(OBJECTS) $(TARGET) + +install: +	$(INSTALL) -d $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) +	$(MINSTALL) -m 755 $(TARGET) $(DESTDIR)/$(XORG_DRIVER_INSTALL_DIR) + + +############################################## + + +.c.o: +	$(CC) -c $(CFLAGS) $(INCLUDES) $(DRIVER_DEFINES) $< -o $@ + + +############################################## + +.PHONY	= all clean install diff --git a/src/gallium/targets/xorg-vmwgfx/SConscript b/src/gallium/targets/xorg-vmwgfx/SConscript new file mode 100644 index 0000000000..b63ab99e05 --- /dev/null +++ b/src/gallium/targets/xorg-vmwgfx/SConscript @@ -0,0 +1,61 @@ +import os.path + +Import('*') + +if not 'svga' in env['drivers']: +    print 'warning: svga pipe driver not built skipping vmwgfx_drv.so' +    Return() + +if env['platform'] == 'linux': + +	env = env.Clone() + +	env.ParseConfig('pkg-config --cflags --libs libdrm xorg-server') + +	env.Prepend(CPPPATH = [ +		'#/include', +		'#/src/gallium', +		'#/src/mesa', +		'#/src/gallium/drivers/svga', +		'#/src/gallium/drivers/svga/include', +	]) + +	env.Append(CPPDEFINES = [ +	]) + +	if env['gcc']: +		env.Append(CPPDEFINES = [ +			'HAVE_STDINT_H', +			'HAVE_SYS_TYPES_H', +		]) + +	env.Append(CFLAGS = [ +		'-std=gnu99', +		'-D_FILE_OFFSET_BITS=64', +	]) + +	env.Prepend(LIBPATH = [ +	]) + +	env.Prepend(LIBS = [ +		trace, +		st_xorg, +		svgadrm, +		svga, +                gallium, +	]) + +	sources = [ +		'vmw_ioctl.c', +		'vmw_screen.c', +		'vmw_video.c', +		'vmw_xorg.c', +	] + +	# TODO: write a wrapper function http://www.scons.org/wiki/WrapperFunctions +	env.LoadableModule( +		target ='vmwgfx_drv.so', +		source = sources, +		LIBS = env['LIBS'], +		SHLIBPREFIX = '', +	) diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_driver.h b/src/gallium/targets/xorg-vmwgfx/vmw_driver.h new file mode 100644 index 0000000000..ba754b51e4 --- /dev/null +++ b/src/gallium/targets/xorg-vmwgfx/vmw_driver.h @@ -0,0 +1,103 @@ +/********************************************************** + * Copyright 2009 VMware, Inc.  All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************/ + +/** + * @file + * Contains the shared resources for VMware Xorg driver + * that sits ontop of the Xorg State Traker. + * + * It is initialized in vmw_screen.c. + * + * @author Jakob Bornecrantz <jakob@vmware.com> + */ + +#ifndef VMW_DRIVER_H_ +#define VMW_DRIVER_H_ + +#include "state_trackers/xorg/xorg_tracker.h" + +struct vmw_dma_buffer; + +struct vmw_customizer +{ +    CustomizerRec base; +    ScrnInfoPtr pScrn; + +    int fd; + +    void *cursor_priv; + +    /* vmw_video.c */ +    void *video_priv; +}; + +static INLINE struct vmw_customizer * +vmw_customizer(CustomizerPtr cust) +{ +    return cust ? (struct vmw_customizer *) cust : NULL; +} + + +/*********************************************************************** + * vmw_video.c + */ + +Bool vmw_video_init(struct vmw_customizer *vmw); + +Bool vmw_video_close(struct vmw_customizer *vmw); + +void vmw_video_stop_all(struct vmw_customizer *vmw); + + +/*********************************************************************** + * vmw_ioctl.c + */ + +int vmw_ioctl_cursor_bypass(struct vmw_customizer *vmw, int xhot, int yhot); + +struct vmw_dma_buffer * vmw_ioctl_buffer_create(struct vmw_customizer *vmw, +						uint32_t size, +						unsigned *handle); + +void * vmw_ioctl_buffer_map(struct vmw_customizer *vmw, +			    struct vmw_dma_buffer *buf); + +void vmw_ioctl_buffer_unmap(struct vmw_customizer *vmw, +			    struct vmw_dma_buffer *buf); + +void vmw_ioctl_buffer_destroy(struct vmw_customizer *vmw, +			      struct vmw_dma_buffer *buf); + +int vmw_ioctl_supports_streams(struct vmw_customizer *vmw); + +int vmw_ioctl_num_streams(struct vmw_customizer *vmw, +			  uint32_t *ntot, uint32_t *nfree); + +int vmw_ioctl_unref_stream(struct vmw_customizer *vmw, uint32_t stream_id); + +int vmw_ioctl_claim_stream(struct vmw_customizer *vmw, uint32_t *out); + + +#endif diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_hook.h b/src/gallium/targets/xorg-vmwgfx/vmw_hook.h new file mode 100644 index 0000000000..224a2d9299 --- /dev/null +++ b/src/gallium/targets/xorg-vmwgfx/vmw_hook.h @@ -0,0 +1,39 @@ +/********************************************************** + * Copyright 2009 VMware, Inc.  All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************/ + +#ifndef VMW_HOOK_H_ +#define VMW_HOOK_H_ + +#include "state_trackers/xorg/xorg_winsys.h" + + +/*********************************************************************** + * vmw_screen.c + */ + +void vmw_screen_set_functions(ScrnInfoPtr pScrn); + + +#endif diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c b/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c new file mode 100644 index 0000000000..96ee4ff82b --- /dev/null +++ b/src/gallium/targets/xorg-vmwgfx/vmw_ioctl.c @@ -0,0 +1,242 @@ +/********************************************************** + * Copyright 2009 VMware, Inc.  All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************/ + +/** + * @file + * Contains the functions for creating dma buffers by calling + * the kernel via driver specific ioctls. + * + * @author Jakob Bornecrantz <jakob@vmware.com> + */ + +#ifndef HAVE_STDINT_H +#define HAVE_STDINT_H 1 +#endif +#define _FILE_OFFSET_BITS 64 + +#include <errno.h> +#include <stdlib.h> +#include <string.h> + +#include <sys/mman.h> +#include "xf86drm.h" +#include "../../winsys/svga/drm/vmwgfx_drm.h" + +#include "vmw_driver.h" +#include "util/u_debug.h" + +struct vmw_dma_buffer +{ +    void *data; +    unsigned handle; +    uint64_t map_handle; +    unsigned map_count; +    uint32_t size; +}; + +static int +vmw_ioctl_get_param(struct vmw_customizer *vmw, uint32_t param, uint64_t *out) +{ +    struct drm_vmw_getparam_arg gp_arg; +    int ret; + +    memset(&gp_arg, 0, sizeof(gp_arg)); +    gp_arg.param = param; +    ret = drmCommandWriteRead(vmw->fd, DRM_VMW_GET_PARAM, +	    &gp_arg, sizeof(gp_arg)); + +    if (ret == 0) { +	*out = gp_arg.value; +    } + +    return ret; +} + +int +vmw_ioctl_supports_streams(struct vmw_customizer *vmw) +{ +    uint64_t value; +    int ret; + +    ret = vmw_ioctl_get_param(vmw, DRM_VMW_PARAM_NUM_STREAMS, &value); +    if (ret) +	return ret; + +    return value ? 0 : -ENOSYS; +} + +int +vmw_ioctl_num_streams(struct vmw_customizer *vmw, +		      uint32_t *ntot, uint32_t *nfree) +{ +    uint64_t v1, v2; +    int ret; + +    ret = vmw_ioctl_get_param(vmw, DRM_VMW_PARAM_NUM_STREAMS, &v1); +    if (ret) +	return ret; + +    ret = vmw_ioctl_get_param(vmw, DRM_VMW_PARAM_NUM_FREE_STREAMS, &v2); +    if (ret) +	return ret; + +    *ntot = (uint32_t)v1; +    *nfree = (uint32_t)v2; + +    return 0; +} + +int +vmw_ioctl_claim_stream(struct vmw_customizer *vmw, uint32_t *out) +{ +    struct drm_vmw_stream_arg s_arg; +    int ret; + +    ret = drmCommandRead(vmw->fd, DRM_VMW_CLAIM_STREAM, +			 &s_arg, sizeof(s_arg)); + +    if (ret) +	return -1; + +    *out = s_arg.stream_id; +    return 0; +} + +int +vmw_ioctl_unref_stream(struct vmw_customizer *vmw, uint32_t stream_id) +{ +    struct drm_vmw_stream_arg s_arg; +    int ret; + +    memset(&s_arg, 0, sizeof(s_arg)); +    s_arg.stream_id = stream_id; + +    ret = drmCommandRead(vmw->fd, DRM_VMW_CLAIM_STREAM, +			 &s_arg, sizeof(s_arg)); + +    return 0; +} + +int +vmw_ioctl_cursor_bypass(struct vmw_customizer *vmw, int xhot, int yhot) +{ +    struct drm_vmw_cursor_bypass_arg arg; +    int ret; + +    memset(&arg, 0, sizeof(arg)); +    arg.flags = DRM_VMW_CURSOR_BYPASS_ALL; +    arg.xhot = xhot; +    arg.yhot = yhot; + +    ret = drmCommandWrite(vmw->fd, DRM_VMW_CURSOR_BYPASS, +			  &arg, sizeof(arg)); + +    return ret; +} + +struct vmw_dma_buffer * +vmw_ioctl_buffer_create(struct vmw_customizer *vmw, uint32_t size, unsigned *handle) +{ +    struct vmw_dma_buffer *buf; +    union drm_vmw_alloc_dmabuf_arg arg; +    struct drm_vmw_alloc_dmabuf_req *req = &arg.req; +    struct drm_vmw_dmabuf_rep *rep = &arg.rep; +    int ret; + +    buf = xcalloc(1, sizeof(*buf)); +    if (!buf) +	goto err; + +    memset(&arg, 0, sizeof(arg)); +    req->size = size; +    do { +	ret = drmCommandWriteRead(vmw->fd, DRM_VMW_ALLOC_DMABUF, &arg, sizeof(arg)); +    } while (ret == -ERESTART); + +    if (ret) { +	debug_printf("IOCTL failed %d: %s\n", ret, strerror(-ret)); +	goto err_free; +    } + + +    buf->data = NULL; +    buf->handle = rep->handle; +    buf->map_handle = rep->map_handle; +    buf->map_count = 0; +    buf->size = size; + +    *handle = rep->handle; + +    return buf; + +err_free: +    xfree(buf); +err: +    return NULL; +} + +void +vmw_ioctl_buffer_destroy(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf) +{  +    struct drm_vmw_unref_dmabuf_arg arg;  + +    if (buf->data) {  +	munmap(buf->data, buf->size);  +	buf->data = NULL;  +    }  + +    memset(&arg, 0, sizeof(arg));  +    arg.handle = buf->handle;  +    drmCommandWrite(vmw->fd, DRM_VMW_UNREF_DMABUF, &arg, sizeof(arg));  + +    xfree(buf);  +}  + +void * +vmw_ioctl_buffer_map(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf) +{ +    void *map; + +    if (buf->data == NULL) { +	map = mmap(NULL, buf->size, PROT_READ | PROT_WRITE, MAP_SHARED, +		   vmw->fd, buf->map_handle); +	if (map == MAP_FAILED) { +	    debug_printf("%s: Map failed.\n", __FUNCTION__); +	    return NULL; +	} + +	buf->data = map; +    } + +    ++buf->map_count; + +    return buf->data; +} + +void +vmw_ioctl_buffer_unmap(struct vmw_customizer *vmw, struct vmw_dma_buffer *buf) +{ +    --buf->map_count; +} diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_screen.c b/src/gallium/targets/xorg-vmwgfx/vmw_screen.c new file mode 100644 index 0000000000..f43f91e5c0 --- /dev/null +++ b/src/gallium/targets/xorg-vmwgfx/vmw_screen.c @@ -0,0 +1,178 @@ +/********************************************************** + * Copyright 2009 VMware, Inc.  All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************/ + +/** + * @file + * Contains the init code for the VMware Xorg driver. + * + * @author Jakob Bornecrantz <jakob@vmware.com> + */ + +#include "vmw_hook.h" +#include "vmw_driver.h" + +#include "cursorstr.h" + +/* modified version of crtc functions */ +xf86CrtcFuncsRec vmw_screen_crtc_funcs; + +static void +vmw_screen_cursor_load_argb(xf86CrtcPtr crtc, CARD32 *image) +{ +    struct vmw_customizer *vmw = +	vmw_customizer(xorg_customizer(crtc->scrn)); +    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn); +    xf86CrtcFuncsPtr funcs = vmw->cursor_priv; +    CursorPtr c = config->cursor; + +    /* Run the ioctl before uploading the image */ +    vmw_ioctl_cursor_bypass(vmw, c->bits->xhot, c->bits->yhot); + +    funcs->load_cursor_argb(crtc, image); +} + +static void +vmw_screen_cursor_init(struct vmw_customizer *vmw) +{ +    ScrnInfoPtr pScrn = vmw->pScrn; +    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); +    int i; + +    /* XXX assume that all crtc's have the same function struct */ + +    /* Save old struct need to call the old functions as well */ +    vmw->cursor_priv = (void*)(config->crtc[0]->funcs); +    memcpy(&vmw_screen_crtc_funcs, vmw->cursor_priv, sizeof(xf86CrtcFuncsRec)); +    vmw_screen_crtc_funcs.load_cursor_argb = vmw_screen_cursor_load_argb; + +    for (i = 0; i < config->num_crtc; i++) +	config->crtc[i]->funcs = &vmw_screen_crtc_funcs; +} + +static void +vmw_screen_cursor_close(struct vmw_customizer *vmw) +{ +    xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(vmw->pScrn); +    int i; + +    vmw_ioctl_cursor_bypass(vmw, 0, 0); + +    for (i = 0; i < config->num_crtc; i++) +	config->crtc[i]->funcs = vmw->cursor_priv; +} + +static Bool +vmw_screen_init(CustomizerPtr cust, int fd) +{ +    struct vmw_customizer *vmw = vmw_customizer(cust); + +    vmw->fd = fd; +    vmw_screen_cursor_init(vmw); + +    /* if gallium is used then we don't need to do anything more. */ +    if (xorg_has_gallium(vmw->pScrn)) +	return TRUE; + +    vmw_video_init(vmw); + +    return TRUE; +} + +static Bool +vmw_screen_close(CustomizerPtr cust) +{ +    struct vmw_customizer *vmw = vmw_customizer(cust); + +    if (!vmw) +	return TRUE; + +    vmw_screen_cursor_close(vmw); + +    vmw_video_close(vmw); + +    return TRUE; +} + +static Bool +vmw_screen_enter_vt(CustomizerPtr cust) +{ +    debug_printf("%s: enter\n", __func__); + +    return TRUE; +} + +static Bool +vmw_screen_leave_vt(CustomizerPtr cust) +{ +    struct vmw_customizer *vmw = vmw_customizer(cust); + +    debug_printf("%s: enter\n", __func__); + +    vmw_video_stop_all(vmw); + +    return TRUE; +} + +/* + * Functions for setting up hooks into the xorg state tracker + */ + +static Bool (*vmw_screen_pre_init_saved)(ScrnInfoPtr pScrn, int flags) = NULL; + +static Bool +vmw_screen_pre_init(ScrnInfoPtr pScrn, int flags) +{ +    struct vmw_customizer *vmw; +    CustomizerPtr cust; + +    vmw = xnfcalloc(1, sizeof(*vmw)); +    if (!vmw) +	return FALSE; + +    cust = &vmw->base; + +    cust->winsys_screen_init = vmw_screen_init; +    cust->winsys_screen_close = vmw_screen_close; +    cust->winsys_enter_vt = vmw_screen_enter_vt; +    cust->winsys_leave_vt = vmw_screen_leave_vt; +    vmw->pScrn = pScrn; + +    pScrn->driverPrivate = cust; + +    pScrn->PreInit = vmw_screen_pre_init_saved; +    if (!pScrn->PreInit(pScrn, flags)) +	return FALSE; + +    return TRUE; +} + +void +vmw_screen_set_functions(ScrnInfoPtr pScrn) +{ +    assert(!vmw_screen_pre_init_saved); + +    vmw_screen_pre_init_saved = pScrn->PreInit; +    pScrn->PreInit = vmw_screen_pre_init; +} diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_video.c b/src/gallium/targets/xorg-vmwgfx/vmw_video.c new file mode 100644 index 0000000000..eced60d0ec --- /dev/null +++ b/src/gallium/targets/xorg-vmwgfx/vmw_video.c @@ -0,0 +1,1072 @@ +/* + * Copyright 2007 by VMware, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of the copyright holder(s) + * and author(s) shall not be used in advertising or otherwise to promote + * the sale, use or other dealings in this Software without prior written + * authorization from the copyright holder(s) and author(s). + */ + +/* + * vmwarevideo.c -- + * + *      Xv extension support. + *      See http://www.xfree86.org/current/DESIGN16.html + * + */ + + +#include "xf86xv.h" +#include "fourcc.h" + +#include "pipe/p_compiler.h" +/* + * We can't incude svga_types.h due to conflicting types for Bool. + */ +typedef int64_t int64; +typedef uint64_t uint64; + +typedef int32_t int32; +typedef uint32_t uint32; + +typedef int16_t int16; +typedef uint16_t uint16; + +typedef int8_t int8; +typedef uint8_t uint8; + +#include "svga/include/svga_reg.h" +#include "svga/include/svga_escape.h" +#include "svga/include/svga_overlay.h" + +#include "vmw_driver.h" + +#include <X11/extensions/Xv.h> + +#include "xf86drm.h" +#include "../../winsys/svga/drm/vmwgfx_drm.h" + +#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) + +/* + * Number of videos that can be played simultaneously + */ +#define VMWARE_VID_NUM_PORTS 1 + +/* + * Using a dark shade as the default colorKey + */ +#define VMWARE_VIDEO_COLORKEY 0x100701 + +/* + * Maximum dimensions + */ +#define VMWARE_VID_MAX_WIDTH    2048 +#define VMWARE_VID_MAX_HEIGHT   2048 + +#define VMWARE_VID_NUM_ENCODINGS 1 +static XF86VideoEncodingRec vmwareVideoEncodings[] = +{ +    { +       0, +       "XV_IMAGE", +       VMWARE_VID_MAX_WIDTH, VMWARE_VID_MAX_HEIGHT, +       {1, 1} +    } +}; + +#define VMWARE_VID_NUM_FORMATS 2 +static XF86VideoFormatRec vmwareVideoFormats[] = +{ +    { 16, TrueColor}, +    { 24, TrueColor} +}; + +#define VMWARE_VID_NUM_IMAGES 3 +static XF86ImageRec vmwareVideoImages[] = +{ +    XVIMAGE_YV12, +    XVIMAGE_YUY2, +    XVIMAGE_UYVY +}; + +#define VMWARE_VID_NUM_ATTRIBUTES 2 +static XF86AttributeRec vmwareVideoAttributes[] = +{ +    { +        XvGettable | XvSettable, +        0x000000, +        0xffffff, +        "XV_COLORKEY" +    }, +    { +        XvGettable | XvSettable, +        0, +        1, +        "XV_AUTOPAINT_COLORKEY" +    } +}; + +/* + * Video frames are stored in a circular list of buffers. + * Must be power or two, See vmw_video_port_play. + */ +#define VMWARE_VID_NUM_BUFFERS 1 + +/* + * Defines the structure used to hold and pass video data to the host + */ +struct vmw_video_buffer +{ +    unsigned handle; +    int size; +    void *data; +    void *extra_data; +    struct vmw_dma_buffer *buf; +}; + + +/** + * Structure representing a single video stream, aka port. + * + * Ports maps one to one to a SVGA stream. Port is just + * what Xv calls a SVGA stream. + */ +struct vmw_video_port +{ +    /* +     * Function prototype same as XvPutImage. +     * +     * This is either set to vmw_video_port_init or vmw_video_port_play. +     * At init this function is set to port_init. In port_init we set it +     * to port_play and call it, after initializing the struct. +     */ +    int (*play)(ScrnInfoPtr, struct vmw_video_port *, +                short, short, short, short, short, +                short, short, short, int, unsigned char*, +                short, short, RegionPtr); + +    /* values to go into the SVGAOverlayUnit */ +    uint32 streamId; +    uint32 colorKey; +    uint32 flags; + +    /* round robin of buffers */ +    unsigned currBuf; +    struct vmw_video_buffer bufs[VMWARE_VID_NUM_BUFFERS]; + +    /* properties that applies to all buffers */ +    int size; +    int pitches[3]; +    int offsets[3]; + +    /* things for X */ +    RegionRec clipBoxes; +    Bool isAutoPaintColorkey; +}; + + +/** + * Structure holding all the infromation for video. + */ +struct vmw_video_private +{ +    int fd; + +    /** ports */ +    struct vmw_video_port port[VMWARE_VID_NUM_PORTS]; + +    /** Used to store port pointers pointers */ +    DevUnion port_ptr[VMWARE_VID_NUM_PORTS]; +}; + + +/* + * Callback functions exported to Xv, prefixed with vmw_xv_*. + */ +static int vmw_xv_put_image(ScrnInfoPtr pScrn, short src_x, short src_y, +                            short drw_x, short drw_y, short src_w, short src_h, +                            short drw_w, short drw_h, int image, +                            unsigned char *buf, short width, short height, +                            Bool sync, RegionPtr clipBoxes, pointer data, +                            DrawablePtr dst); +static void vmw_xv_stop_video(ScrnInfoPtr pScrn, pointer data, Bool Cleanup); +static int vmw_xv_query_image_attributes(ScrnInfoPtr pScrn, int format, +                                         unsigned short *width, +                                         unsigned short *height, int *pitches, +                                         int *offsets); +static int vmw_xv_set_port_attribute(ScrnInfoPtr pScrn, Atom attribute, +                                     INT32 value, pointer data); +static int vmw_xv_get_port_attribute(ScrnInfoPtr pScrn, Atom attribute, +                                     INT32 *value, pointer data); +static void vmw_xv_query_best_size(ScrnInfoPtr pScrn, Bool motion, +                                short vid_w, short vid_h, short drw_w, +                                short drw_h, unsigned int *p_w, +                                unsigned int *p_h, pointer data); + + +/* + * Local functions. + */ +static XF86VideoAdaptorPtr vmw_video_init_adaptor(ScrnInfoPtr pScrn, struct vmw_customizer *vmw); + +static int vmw_video_port_init(ScrnInfoPtr pScrn, +                               struct vmw_video_port *port, +                               short src_x, short src_y, short drw_x, +                               short drw_y, short src_w, short src_h, +                               short drw_w, short drw_h, int format, +                               unsigned char *buf, short width, +                               short height, RegionPtr clipBoxes); +static int vmw_video_port_play(ScrnInfoPtr pScrn, struct vmw_video_port *port, +                               short src_x, short src_y, short drw_x, +                               short drw_y, short src_w, short src_h, +                               short drw_w, short drw_h, int format, +                               unsigned char *buf, short width, +                               short height, RegionPtr clipBoxes); +static void vmw_video_port_cleanup(ScrnInfoPtr pScrn, struct vmw_video_port *port); + +static int vmw_video_buffer_alloc(struct vmw_customizer *vmw, int size, +                                  struct vmw_video_buffer *out); +static int vmw_video_buffer_free(struct vmw_customizer *vmw, +                                 struct vmw_video_buffer *out); + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_init -- + * + *    Initializes Xv support. + * + * Results: + *    TRUE on success, FALSE on error. + * + * Side effects: + *    Xv support is initialized. Memory is allocated for all supported + *    video streams. + * + *----------------------------------------------------------------------------- + */ + +Bool +vmw_video_init(struct vmw_customizer *vmw) +{ +    ScrnInfoPtr pScrn = vmw->pScrn; +    ScreenPtr pScreen = pScrn->pScreen; +    XF86VideoAdaptorPtr *overlayAdaptors, *newAdaptors = NULL; +    XF86VideoAdaptorPtr newAdaptor = NULL; +    int numAdaptors; +    unsigned int ntot, nfree; + +    debug_printf("%s: enter\n", __func__); + +    if (vmw_ioctl_num_streams(vmw, &ntot, &nfree) != 0) { +        debug_printf("No stream ioctl support\n"); +        return FALSE; +    } + +    if (nfree == 0) { +        debug_printf("No free streams\n"); +        return FALSE; +    } + +    numAdaptors = xf86XVListGenericAdaptors(pScrn, &overlayAdaptors); + +    newAdaptor = vmw_video_init_adaptor(pScrn, vmw); +    if (!newAdaptor) { +        debug_printf("Failed to initialize Xv extension\n"); +        return FALSE; +    } + +    if (!numAdaptors) { +        numAdaptors = 1; +        overlayAdaptors = &newAdaptor; +    } else { +         newAdaptors = xalloc((numAdaptors + 1) * +                              sizeof(XF86VideoAdaptorPtr*)); +         if (!newAdaptors) { +            xf86XVFreeVideoAdaptorRec(newAdaptor); +            return FALSE; +         } + +         memcpy(newAdaptors, overlayAdaptors, +                numAdaptors * sizeof(XF86VideoAdaptorPtr)); +         newAdaptors[numAdaptors++] = newAdaptor; +         overlayAdaptors = newAdaptors; +    } + +    if (!xf86XVScreenInit(pScreen, overlayAdaptors, numAdaptors)) { +        debug_printf("Failed to initialize Xv extension\n"); +        xf86XVFreeVideoAdaptorRec(newAdaptor); +        return FALSE; +    } + +    if (newAdaptors) { +        xfree(newAdaptors); +    } + +    debug_printf("Initialized VMware Xv extension successfully\n"); + +    return TRUE; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_close -- + * + *    Unitializes video. + * + * Results: + *    TRUE. + * + * Side effects: + *    vmw->video_priv = NULL + * + *----------------------------------------------------------------------------- + */ + +Bool +vmw_video_close(struct vmw_customizer *vmw) +{ +    ScrnInfoPtr pScrn = vmw->pScrn; +    struct vmw_video_private *video; +    int i; + +    debug_printf("%s: enter\n", __func__); + +    video = vmw->video_priv; +    if (!video) +	return TRUE; + +    for (i = 0; i < VMWARE_VID_NUM_PORTS; ++i) { +	/* make sure the port is stoped as well */ +	vmw_xv_stop_video(pScrn, &video->port[i], TRUE); +	vmw_ioctl_unref_stream(vmw, video->port[i].streamId); +    } + +    /* XXX: I'm sure this function is missing code for turning off Xv */ + +    free(vmw->video_priv); +    vmw->video_priv = NULL; + +    return TRUE; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_stop_all -- + * + *    Stop all video streams from playing. + * + * Results: + *    None. + * + * Side effects: + *    All buffers are freed. + * + *----------------------------------------------------------------------------- + */ + +void vmw_video_stop_all(struct vmw_customizer *vmw) +{ +    ScrnInfoPtr pScrn = vmw->pScrn; +    struct vmw_video_private *video = vmw->video_priv; +    int i; + +    debug_printf("%s: enter\n", __func__); + +    if (!video) +	return; + +    for (i = 0; i < VMWARE_VID_NUM_PORTS; ++i) { +	vmw_xv_stop_video(pScrn, &video->port[i], TRUE); +    } +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_init_adaptor -- + * + *    Initializes a XF86VideoAdaptor structure with the capabilities and + *    functions supported by this video driver. + * + * Results: + *    On success initialized XF86VideoAdaptor struct or NULL on error + * + * Side effects: + *    None. + * + *----------------------------------------------------------------------------- + */ + +static XF86VideoAdaptorPtr +vmw_video_init_adaptor(ScrnInfoPtr pScrn, struct vmw_customizer *vmw) +{ +    XF86VideoAdaptorPtr adaptor; +    struct vmw_video_private *video; +    int i; + +    debug_printf("%s: enter \n", __func__); + +    adaptor = xf86XVAllocateVideoAdaptorRec(pScrn); +    if (!adaptor) { +        debug_printf("Not enough memory\n"); +        return NULL; +    } + +    video = xcalloc(1, sizeof(*video)); +    if (!video) { +        debug_printf("Not enough memory.\n"); +        xf86XVFreeVideoAdaptorRec(adaptor); +        return NULL; +    } + +    vmw->video_priv = video; + +    adaptor->type = XvInputMask | XvImageMask | XvWindowMask; +    adaptor->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; +    adaptor->name = "VMware Video Engine"; +    adaptor->nEncodings = VMWARE_VID_NUM_ENCODINGS; +    adaptor->pEncodings = vmwareVideoEncodings; +    adaptor->nFormats = VMWARE_VID_NUM_FORMATS; +    adaptor->pFormats = vmwareVideoFormats; +    adaptor->nPorts = VMWARE_VID_NUM_PORTS; +    adaptor->pPortPrivates = video->port_ptr; + +    for (i = 0; i < VMWARE_VID_NUM_PORTS; ++i) { +        vmw_ioctl_claim_stream(vmw, &video->port[i].streamId); +        video->port[i].play = vmw_video_port_init; +        video->port[i].flags = SVGA_VIDEO_FLAG_COLORKEY; +        video->port[i].colorKey = VMWARE_VIDEO_COLORKEY; +        video->port[i].isAutoPaintColorkey = TRUE; +        adaptor->pPortPrivates[i].ptr = &video->port[i]; +    } + +    adaptor->nAttributes = VMWARE_VID_NUM_ATTRIBUTES; +    adaptor->pAttributes = vmwareVideoAttributes; + +    adaptor->nImages = VMWARE_VID_NUM_IMAGES; +    adaptor->pImages = vmwareVideoImages; + +    adaptor->PutVideo = NULL; +    adaptor->PutStill = NULL; +    adaptor->GetVideo = NULL; +    adaptor->GetStill = NULL; +    adaptor->StopVideo = vmw_xv_stop_video; +    adaptor->SetPortAttribute = vmw_xv_set_port_attribute; +    adaptor->GetPortAttribute = vmw_xv_get_port_attribute; +    adaptor->QueryBestSize = vmw_xv_query_best_size; +    adaptor->PutImage = vmw_xv_put_image; +    adaptor->QueryImageAttributes = vmw_xv_query_image_attributes; + +    debug_printf("%s: done %p\n", __func__, adaptor); + +    return adaptor; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_port_init -- + * + *    Initializes a video stream in response to the first PutImage() on a + *    video stream. The process goes as follows: + *    - Figure out characteristics according to format + *    - Allocate offscreen memory + *    - Pass on video to Play() functions + * + * Results: + *    Success or XvBadAlloc on failure. + * + * Side effects: + *    Video stream is initialized and its first frame sent to the host + *    (done by VideoPlay() function called at the end) + * + *----------------------------------------------------------------------------- + */ + +static int +vmw_video_port_init(ScrnInfoPtr pScrn, struct vmw_video_port *port, +                    short src_x, short src_y, short drw_x, +                    short drw_y, short src_w, short src_h, +                    short drw_w, short drw_h, int format, +                    unsigned char *buf, short width, +                    short height, RegionPtr clipBoxes) +{ +    struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); +    unsigned short w, h; +    int i, ret; + +    debug_printf("\t%s: id %d, format %d\n", __func__, port->streamId, format); + +    w = width; +    h = height; +    /* init all the format attributes, used for buffers */ +    port->size = vmw_xv_query_image_attributes(pScrn, format, &w, &h, +                                               port->pitches, port->offsets); + +    if (port->size == -1) +        return XvBadAlloc; + +    port->play = vmw_video_port_play; + +    for (i = 0; i < VMWARE_VID_NUM_BUFFERS; ++i) { +	ret = vmw_video_buffer_alloc(vmw, port->size, &port->bufs[i]); +	if (ret != Success) +	    break; +    } + +    /* Free all allocated buffers on failure */ +    if (ret != Success) { +	for (--i; i >= 0; --i) { +	    vmw_video_buffer_free(vmw, &port->bufs[i]); +	} +	return ret; +    } + +    port->currBuf = 0; + +    REGION_COPY(pScrn->pScreen, &port->clipBoxes, clipBoxes); + +    if (port->isAutoPaintColorkey) +        xf86XVFillKeyHelper(pScrn->pScreen, port->colorKey, clipBoxes); + +    return port->play(pScrn, port, src_x, src_y, drw_x, drw_y, src_w, src_h, +                      drw_w, drw_h, format, buf, width, height, clipBoxes); +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_port_play -- + * + *    Sends all the attributes associated with the video frame using the + *    FIFO ESCAPE mechanism to the host. + * + * Results: + *    Always returns Success. + * + * Side effects: + *    None. + * + *----------------------------------------------------------------------------- + */ + +static int +vmw_video_port_play(ScrnInfoPtr pScrn, struct vmw_video_port *port, +                    short src_x, short src_y, short drw_x, +                    short drw_y, short src_w, short src_h, +                    short drw_w, short drw_h, int format, +                    unsigned char *buf, short width, +                    short height, RegionPtr clipBoxes) +{ +    struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); +    struct drm_vmw_control_stream_arg arg; +    unsigned short w, h; +    int size; +    int ret; + +    debug_printf("\t%s: enter\n", __func__); + +    w = width; +    h = height; + +    /* we don't update the ports size */ +    size = vmw_xv_query_image_attributes(pScrn, format, &w, &h, +                                         port->pitches, port->offsets); + +    if (size > port->size) { +        debug_printf("\t%s: Increase in size of Xv video frame streamId:%d.\n", +                     __func__, port->streamId); +        vmw_xv_stop_video(pScrn, port, TRUE); +        return port->play(pScrn, port, src_x, src_y, drw_x, drw_y, src_w, +                          src_h, drw_w, drw_h, format, buf, width, height, +                          clipBoxes); +    } + +    memcpy(port->bufs[port->currBuf].data, buf, port->size); + +    memset(&arg, 0, sizeof(arg)); + +    arg.stream_id = port->streamId; +    arg.enabled = TRUE; +    arg.flags = port->flags; +    arg.color_key = port->colorKey; +    arg.handle = port->bufs[port->currBuf].handle; +    arg.format = format; +    arg.size = port->size; +    arg.width = w; +    arg.height = h; +    arg.src.x = src_x; +    arg.src.y = src_y; +    arg.src.w = src_w; +    arg.src.h = src_h; +    arg.dst.x = drw_x; +    arg.dst.y = drw_y; +    arg.dst.w = drw_w; +    arg.dst.h = drw_h; +    arg.pitch[0] = port->pitches[0]; +    arg.pitch[1] = port->pitches[1]; +    arg.pitch[2] = port->pitches[2]; +    arg.offset = 0; + +    /* +     *  Update the clipList and paint the colorkey, if required. +     */ +    if (!REGION_EQUAL(pScrn->pScreen, &port->clipBoxes, clipBoxes)) { +        REGION_COPY(pScrn->pScreen, &port->clipBoxes, clipBoxes); +        if (port->isAutoPaintColorkey) { +            xf86XVFillKeyHelper(pScrn->pScreen, port->colorKey, clipBoxes); +        } +    } + +    ret = drmCommandWrite(vmw->fd, DRM_VMW_CONTROL_STREAM, &arg, sizeof(arg)); +    if (ret) { +	vmw_video_port_cleanup(pScrn, port); +	return XvBadAlloc; +    } + +    if (++(port->currBuf) >= VMWARE_VID_NUM_BUFFERS) +	port->currBuf = 0; + +    return Success; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_port_cleanup -- + * + *    Frees up all resources (if any) taken by a video stream. + * + * Results: + *    None. + * + * Side effects: + *    Same as above. + * + *----------------------------------------------------------------------------- + */ + +static void +vmw_video_port_cleanup(ScrnInfoPtr pScrn, struct vmw_video_port *port) +{ +    struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); +    uint32 id, colorKey, flags; +    Bool isAutoPaintColorkey; +    int i; + +    debug_printf("\t%s: enter\n", __func__); + +    for (i = 0; i < VMWARE_VID_NUM_BUFFERS; i++) { +	vmw_video_buffer_free(vmw, &port->bufs[i]); +    } + +    /* +     * reset stream for next video +     */ +    id = port->streamId; +    colorKey = port->colorKey; +    flags = port->flags; +    isAutoPaintColorkey = port->isAutoPaintColorkey; + +    memset(port, 0, sizeof(*port)); + +    port->streamId = id; +    port->play = vmw_video_port_init; +    port->colorKey = colorKey; +    port->flags = flags; +    port->isAutoPaintColorkey = isAutoPaintColorkey; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_buffer_alloc -- + * + *    Allocates and map a kernel buffer to be used as data storage. + * + * Results: + *    XvBadAlloc on failure, otherwise Success. + * + * Side effects: + *    Calls into the kernel, sets members of out. + * + *----------------------------------------------------------------------------- + */ + +static int +vmw_video_buffer_alloc(struct vmw_customizer *vmw, int size, +                       struct vmw_video_buffer *out) +{ +    out->buf = vmw_ioctl_buffer_create(vmw, size, &out->handle); +    if (!out->buf) +	return XvBadAlloc; + +    out->data = vmw_ioctl_buffer_map(vmw, out->buf); +    if (!out->data) { +	vmw_ioctl_buffer_destroy(vmw, out->buf); + +	out->handle = 0; +	out->buf = NULL; + +	return XvBadAlloc; +    } + +    out->size = size; +    out->extra_data = xcalloc(1, size); + +    debug_printf("\t\t%s: allocated buffer %p of size %i\n", __func__, out, size); + +    return Success; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_video_buffer_free -- + * + *    Frees and unmaps an allocated kernel buffer. + * + * Results: + *    Success. + * + * Side effects: + *    Calls into the kernel, sets members of out to 0. + * + *----------------------------------------------------------------------------- + */ + +static int +vmw_video_buffer_free(struct vmw_customizer *vmw, +                      struct vmw_video_buffer *out) +{ +    if (out->size == 0) +	return Success; + +    xfree(out->extra_data); +    vmw_ioctl_buffer_unmap(vmw, out->buf); +    vmw_ioctl_buffer_destroy(vmw, out->buf); + +    out->buf = NULL; +    out->data = NULL; +    out->handle = 0; +    out->size = 0; + +    debug_printf("\t\t%s: freed buffer %p\n", __func__, out); + +    return Success; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_xv_put_image -- + * + *    Main video playback function. It copies the passed data which is in + *    the specified format (e.g. FOURCC_YV12) into the overlay. + * + *    If sync is TRUE the driver should not return from this + *    function until it is through reading the data from buf. + * + * Results: + *    Success or XvBadAlloc on failure + * + * Side effects: + *    Video port will be played(initialized if 1st frame) on success + *    or will fail on error. + * + *----------------------------------------------------------------------------- + */ + +static int +vmw_xv_put_image(ScrnInfoPtr pScrn, short src_x, short src_y, +                 short drw_x, short drw_y, short src_w, short src_h, +                 short drw_w, short drw_h, int format, +                 unsigned char *buf, short width, short height, +                 Bool sync, RegionPtr clipBoxes, pointer data, +                 DrawablePtr dst) +{ +    struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); +    struct vmw_video_port *port = data; + +    debug_printf("%s: enter (%u, %u) (%ux%u) (%u, %u) (%ux%u) (%ux%u)\n", __func__, +		 src_x, src_y, src_w, src_h, +		 drw_x, drw_y, drw_w, drw_h, +		 width, height); + +    if (!vmw->video_priv) +        return XvBadAlloc; + +    return port->play(pScrn, port, src_x, src_y, drw_x, drw_y, src_w, src_h, +                      drw_w, drw_h, format, buf, width, height, clipBoxes); +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_xv_stop_video -- + * + *    Called when we should stop playing video for a particular stream. If + *    Cleanup is FALSE, the "stop" operation is only temporary, and thus we + *    don't do anything. If Cleanup is TRUE we kill the video port by + *    sending a message to the host and freeing up the stream. + * + * Results: + *    None. + * + * Side effects: + *    See above. + * + *----------------------------------------------------------------------------- + */ + +static void +vmw_xv_stop_video(ScrnInfoPtr pScrn, pointer data, Bool cleanup) +{ +    struct vmw_customizer *vmw = vmw_customizer(xorg_customizer(pScrn)); +    struct vmw_video_port *port = data; +    struct drm_vmw_control_stream_arg arg; +    int ret; + +    debug_printf("%s: cleanup is %s\n", __func__, cleanup ? "TRUE" : "FALSE"); + +    if (!vmw->video_priv) +        return; + +    if (!cleanup) +        return; + + +    memset(&arg, 0, sizeof(arg)); +    arg.stream_id = port->streamId; +    arg.enabled = FALSE; + +    ret = drmCommandWrite(vmw->fd, DRM_VMW_CONTROL_STREAM, &arg, sizeof(arg)); +    assert(ret == 0); + +    vmw_video_port_cleanup(pScrn, port); +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_xv_query_image_attributes -- + * + *    From the spec: This function is called to let the driver specify how data + *    for a particular image of size width by height should be stored. + *    Sometimes only the size and corrected width and height are needed. In + *    that case pitches and offsets are NULL. + * + * Results: + *    The size of the memory required for the image, or -1 on error. + * + * Side effects: + *    None. + * + *----------------------------------------------------------------------------- + */ + +static int +vmw_xv_query_image_attributes(ScrnInfoPtr pScrn, int format, +                              unsigned short *width, unsigned short *height, +                              int *pitches, int *offsets) +{ +    INT32 size, tmp; + +    if (*width > VMWARE_VID_MAX_WIDTH) { +        *width = VMWARE_VID_MAX_WIDTH; +    } +    if (*height > VMWARE_VID_MAX_HEIGHT) { +        *height = VMWARE_VID_MAX_HEIGHT; +    } + +    *width = (*width + 1) & ~1; +    if (offsets != NULL) { +        offsets[0] = 0; +    } + +    switch (format) { +       case FOURCC_YV12: +           *height = (*height + 1) & ~1; +           size = (*width + 3) & ~3; +           if (pitches) { +               pitches[0] = size; +           } +           size *= *height; +           if (offsets) { +               offsets[1] = size; +           } +           tmp = ((*width >> 1) + 3) & ~3; +           if (pitches) { +                pitches[1] = pitches[2] = tmp; +           } +           tmp *= (*height >> 1); +           size += tmp; +           if (offsets) { +               offsets[2] = size; +           } +           size += tmp; +           break; +       case FOURCC_UYVY: +       case FOURCC_YUY2: +           size = *width * 2; +           if (pitches) { +               pitches[0] = size; +           } +           size *= *height; +           break; +       default: +           debug_printf("Query for invalid video format %d\n", format); +           return -1; +    } +    return size; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_xv_set_port_attribute -- + * + *    From the spec: A port may have particular attributes such as colorKey, hue, + *    saturation, brightness or contrast. Xv clients set these + *    attribute values by sending attribute strings (Atoms) to the server. + * + * Results: + *    Success if the attribute exists and XvBadAlloc otherwise. + * + * Side effects: + *    The respective attribute gets the new value. + * + *----------------------------------------------------------------------------- + */ + +static int +vmw_xv_set_port_attribute(ScrnInfoPtr pScrn, Atom attribute, +                          INT32 value, pointer data) +{ +    struct vmw_video_port *port = data; +    Atom xvColorKey = MAKE_ATOM("XV_COLORKEY"); +    Atom xvAutoPaint = MAKE_ATOM("XV_AUTOPAINT_COLORKEY"); + +    if (attribute == xvColorKey) { +        debug_printf("%s: Set colorkey:0x%x\n", __func__, (unsigned)value); +        port->colorKey = value; +    } else if (attribute == xvAutoPaint) { +        debug_printf("%s: Set autoPaint: %s\n", __func__, value? "TRUE": "FALSE"); +        port->isAutoPaintColorkey = value; +    } else { +        return XvBadAlloc; +    } + +    return Success; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_xv_get_port_attribute -- + * + *    From the spec: A port may have particular attributes such as hue, + *    saturation, brightness or contrast. Xv clients get these + *    attribute values by sending attribute strings (Atoms) to the server + * + * Results: + *    Success if the attribute exists and XvBadAlloc otherwise. + * + * Side effects: + *    "value" contains the requested attribute on success. + * + *----------------------------------------------------------------------------- + */ + +static int +vmw_xv_get_port_attribute(ScrnInfoPtr pScrn, Atom attribute, +                          INT32 *value, pointer data) +{ +    struct vmw_video_port *port = data; +    Atom xvColorKey = MAKE_ATOM("XV_COLORKEY"); +    Atom xvAutoPaint = MAKE_ATOM("XV_AUTOPAINT_COLORKEY"); + +    if (attribute == xvColorKey) { +        *value = port->colorKey; +    } else if (attribute == xvAutoPaint) { +        *value = port->isAutoPaintColorkey; +    } else { +        return XvBadAlloc; +    } + +    return Success; +} + + +/* + *----------------------------------------------------------------------------- + * + * vmw_xv_query_best_size -- + * + *    From the spec: QueryBestSize provides the client with a way to query what + *    the destination dimensions would end up being if they were to request + *    that an area vid_w by vid_h from the video stream be scaled to rectangle + *    of drw_w by drw_h on the screen. Since it is not expected that all + *    hardware will be able to get the target dimensions exactly, it is + *    important that the driver provide this function. + * + *    This function seems to never be called, but to be on the safe side + *    we apply the same logic that QueryImageAttributes has for width + *    and height. + * + * Results: + *    None. + * + * Side effects: + *    None. + * + *----------------------------------------------------------------------------- + */ + +static void +vmw_xv_query_best_size(ScrnInfoPtr pScrn, Bool motion, +                       short vid_w, short vid_h, short drw_w, +                       short drw_h, unsigned int *p_w, +                       unsigned int *p_h, pointer data) +{ +    *p_w = (drw_w + 1) & ~1; +    *p_h = drw_h; + +    return; +} diff --git a/src/gallium/targets/xorg-vmwgfx/vmw_xorg.c b/src/gallium/targets/xorg-vmwgfx/vmw_xorg.c new file mode 100644 index 0000000000..87aad25b24 --- /dev/null +++ b/src/gallium/targets/xorg-vmwgfx/vmw_xorg.c @@ -0,0 +1,191 @@ +/********************************************************** + * Copyright 2008-2009 VMware, Inc.  All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + **********************************************************/ + +/** + * @file + * Glue file for Xorg State Tracker. + * + * @author Alan Hourihane <alanh@tungstengraphics.com> + * @author Jakob Bornecrantz <wallbraker@gmail.com> + */ + +#include "vmw_hook.h" + + +/* + * Defines and modinfo + */ + +#define VMWGFX_DRIVER_NAME "vmwgfx" + +#define VMW_STRING_INNER(s) #s +#define VMW_STRING(str) VMW_STRING_INNER(str) + +#define VMWGFX_VERSION_MAJOR 11 +#define VMWGFX_VERSION_MINOR 0 +#define VMWGFX_VERSION_PATCH 0 +#define VMWGFX_VERSION_STRING_MAJOR VMW_STRING(VMWGFX_VERSION_MAJOR) +#define VMWGFX_VERSION_STRING_MINOR VMW_STRING(VMWGFX_VERSION_MINOR) +#define VMWGFX_VERSION_STRING_PATCH VMW_STRING(VMWGFX_VERSION_PATCH) + +#define VMWGFX_DRIVER_VERSION \ +   (VMWGFX_VERSION_MAJOR * 65536 + VMWGFX_VERSION_MINOR * 256 + VMWGFX_VERSION_PATCH) +#define VMWGFX_DRIVER_VERSION_STRING \ +    VMWGFX_VERSION_STRING_MAJOR "." VMWGFX_VERSION_STRING_MINOR \ +    "." VMWGFX_VERSION_STRING_PATCH + +/* + * Standard four digit version string expected by VMware Tools installer. + * As the driver's version is only  {major, minor, patchlevel}, simply append an + * extra zero for the fourth digit. + */ +#ifdef __GNUC__ +_X_EXPORT const char vmwgfx_drv_modinfo[] __attribute__((section(".modinfo"),unused)) = +    "version=" VMWGFX_DRIVER_VERSION_STRING ".0"; +#endif + +static void vmw_xorg_identify(int flags); +_X_EXPORT Bool vmw_xorg_pci_probe(DriverPtr driver, +				  int entity_num, +				  struct pci_device *device, +				  intptr_t match_data); + + +/* + * Tables + */ + +static const struct pci_id_match vmw_xorg_device_match[] = { +    {0x15ad, PCI_MATCH_ANY, PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, 0}, +    {0, 0, 0, 0, 0, 0, 0}, +}; + +static SymTabRec vmw_xorg_chipsets[] = { +    {PCI_MATCH_ANY, "VMware SVGA Device"}, +    {-1, NULL} +}; + +static PciChipsets vmw_xorg_pci_devices[] = { +    {PCI_MATCH_ANY, PCI_MATCH_ANY, NULL}, +    {-1, -1, NULL} +}; + +static XF86ModuleVersionInfo vmw_xorg_version = { +    VMWGFX_DRIVER_NAME, +    MODULEVENDORSTRING, +    MODINFOSTRING1, +    MODINFOSTRING2, +    XORG_VERSION_CURRENT, +    VMWGFX_VERSION_MAJOR, VMWGFX_VERSION_MINOR, VMWGFX_VERSION_PATCH, +    ABI_CLASS_VIDEODRV, +    ABI_VIDEODRV_VERSION, +    MOD_CLASS_VIDEODRV, +    {0, 0, 0, 0} +}; + +/* + * Xorg driver exported structures + */ + +_X_EXPORT DriverRec vmwgfx = { +    1, +    VMWGFX_DRIVER_NAME, +    vmw_xorg_identify, +    NULL, +    xorg_tracker_available_options, +    NULL, +    0, +    NULL, +    vmw_xorg_device_match, +    vmw_xorg_pci_probe +}; + +static MODULESETUPPROTO(vmw_xorg_setup); + +_X_EXPORT XF86ModuleData vmwgfxModuleData = { +    &vmw_xorg_version, +    vmw_xorg_setup, +    NULL +}; + + +/* + * Xorg driver functions + */ + +static pointer +vmw_xorg_setup(pointer module, pointer opts, int *errmaj, int *errmin) +{ +    static Bool setupDone = 0; + +    /* This module should be loaded only once, but check to be sure. +     */ +    if (!setupDone) { +	setupDone = 1; +	xf86AddDriver(&vmwgfx, module, HaveDriverFuncs); + +	/* +	 * The return value must be non-NULL on success even though there +	 * is no TearDownProc. +	 */ +	return (pointer) 1; +    } else { +	if (errmaj) +	    *errmaj = LDR_ONCEONLY; +	return NULL; +    } +} + +static void +vmw_xorg_identify(int flags) +{ +    xf86PrintChipsets("vmwgfx", "Driver for VMware SVGA device", +		      vmw_xorg_chipsets); +} + +_X_EXPORT Bool +vmw_xorg_pci_probe(DriverPtr driver, +	  int entity_num, struct pci_device *device, intptr_t match_data) +{ +    ScrnInfoPtr scrn = NULL; +    EntityInfoPtr entity; + +    scrn = xf86ConfigPciEntity(scrn, 0, entity_num, vmw_xorg_pci_devices, +			       NULL, NULL, NULL, NULL, NULL); +    if (scrn != NULL) { +	scrn->driverVersion = 1; +	scrn->driverName = "vmwgfx"; +	scrn->name = "vmwgfx"; +	scrn->Probe = NULL; + +	entity = xf86GetEntityInfo(entity_num); + +	/* Use all the functions from the xorg tracker */ +	xorg_tracker_set_functions(scrn); + +	vmw_screen_set_functions(scrn); +    } +    return scrn != NULL; +} | 
