diff options
| author | wyatt8740 <wyatt8740@users.noreply.github.com> | 2023-10-01 23:53:17 -0400 |
|---|---|---|
| committer | wyatt8740 <wyatt8740@users.noreply.github.com> | 2023-10-02 00:00:01 -0400 |
| commit | 72d9253ab2e5e0630c824c7130a40b7158323bc9 (patch) | |
| tree | fc12bd36b3eb63ef6aeae213018d4f89981a08f4 | |
| parent | 68254ebe0411236d178ead073d5c176faae732a1 (diff) | |
| download | quake-pum-72d9253ab2e5e0630c824c7130a40b7158323bc9.tar.gz | |
Got X11 QuakeWorld to build (no GLQuakeWorld yet!).
Added support for 24-bit color depth (ripped out of WinQuake, which appears
to have a newer version of vid_x.c).
Also, added SDL audio code (almost directly translated from WinQuake/netquake code).
| -rw-r--r-- | QW/Makefile | 964 | ||||
| -rw-r--r-- | QW/client/cvar.h | 6 | ||||
| -rw-r--r-- | QW/client/snd_dma.c | 12 | ||||
| -rw-r--r-- | QW/client/snd_sdl.c | 215 | ||||
| -rw-r--r-- | QW/client/sound.h | 7 | ||||
| -rw-r--r-- | QW/client/vid_x.c | 136 | ||||
| -rw-r--r-- | QW/vid_x.c | 1116 |
7 files changed, 2434 insertions, 22 deletions
diff --git a/QW/Makefile b/QW/Makefile new file mode 100644 index 0000000..9b71965 --- /dev/null +++ b/QW/Makefile @@ -0,0 +1,964 @@ +# +# QuakeWorld Makefile for Linux 2.0 +# +# Apr '98 by Zoid <zoid@idsoftware.com> +# +# GNU Make required +# +# ELF only +# + +# RPM release number +RPM_RELEASE=1 + + +USE_SDL2=1 + +ifeq ($(USE_SDL2),1) +SDL_CONFIG ?= sdl2-config +else +SDL_CONFIG ?= sdl-config +endif +SDL_CFLAGS := $(shell $(SDL_CONFIG) --cflags) -DUSE_SDL2 +# had to tack all the crap on the end because of wayland basically +SDL_LIBS := $(shell $(SDL_CONFIG) --libs) -lwayland-client -lxkbcommon -lwayland-cursor -ldrm -lwayland-egl -lgbm -lXxf86vm -lXss -lXrandr -lXcursor -lXinerama -lpulse -lasound -lXi + + +VERSION=2.30$(GLIBC) + +ifneq (,$(findstring libc6,$(shell if [ -e /lib/libc.so.6* ];then echo libc6;fi))) +GLIBC=-glibc +else +GLIBC= +endif + +ifneq (,$(findstring alpha,$(shell uname -m))) +ARCH=axp +RPMARCH=alpha +else +ARCH=i386 +RPMARCH=i386 +endif + +# Edit this path, or you will probably run into trouble. +MAINDIR=/home/wyatt/development/Quake-LinuxUpdate/QW + +BUILD_DEBUG_DIR=debug$(ARCH)$(GLIBC) +BUILD_RELEASE_DIR=release$(ARCH)$(GLIBC) +CLIENT_DIR=$(MAINDIR)/client +SERVER_DIR=$(MAINDIR)/server + +MESA_DIR=/usr/local/src/Mesa-3.0 + +CC=gcc +BASE_CFLAGS=-m32 -no-pie -fcommon -Wall -Dstricmp=strcasecmp -I$(CLIENT_DIR) -I$(SERVER_DIR) -I$(SERVER_DIR)/.. -I$(MAINDIR)/sdl2_i386/usr/include/SDL2 -D_REENTRANT $(SDL_CFLAGS) +# -I/usr/src/linux-headers-3.16-2-common/arch/x86/include -I/usr/src/linux-headers-3.16-2-common/include/ -I/usr/src/linux-headers-3.16-2-amd64/arch/x86/include/generated/ +DEBUG_CFLAGS=$(BASE_CFLAGS) -g +ifeq ($(ARCH),axp) +RELEASE_CFLAGS=$(BASE_CFLAGS) -ffast-math -funroll-loops \ + -fomit-frame-pointer -fexpensive-optimizations +else +RELEASE_CFLAGS=$(BASE_CFLAGS) -march=core2 -mtune=core2 -O3 +#RELEASE_CFLAGS=$(BASE_CFLAGS) -m486 -O6 -ffast-math -funroll-loops \ +# -fomit-frame-pointer -fexpensive-optimizations -malign-loops=2 \ +# -malign-jumps=2 -malign-functions=2 +endif +GLCFLAGS=-DGLQUAKE -I/usr/local/src/Mesa-3.0/include -I/usr/include/glide + +LDFLAGS=-lm $(shell $(SDL_CONFIG) --libs) -lwayland-client -lxkbcommon -lwayland-cursor -ldrm -lwayland-egl -lgbm -lXxf86vm -lXss -lXrandr -lXcursor -lXinerama -lpulse -lasound -lXi +SVGALDFLAGS=-lvga +XLDFLAGS=-L/usr/X11R6/lib -L/usr/lib/i386-linux-gnu -L$(MAINDIR)/sdl2_i386/usr/ -lX11 -lXext -lSDL2 /usr/lib/i386-linux-gnu/libXxf86dga.so.1.0.0 +GL_SVGA_LDFLAGS=-L/usr/X11/lib -L/usr/local/src/Mesa-3.0/lib -lm -lMesaGL -lglide2x -lX11 -lXext -lvga +GL_X11_LDFLAGS=-L/usr/X11/lib -L/usr/local/src/Mesa-3.0/lib -lm -lGL -lX11 -lXext + +DO_CC=$(CC) $(CFLAGS) -o $@ -c $< +DO_O_CC=$(CC) -O $(CFLAGS) -o $@ -c $< +DO_GL_CC=$(CC) $(CFLAGS) $(GLCFLAGS) -o $@ -c $< +DO_SERVER_CC=$(CC) -DSERVERONLY $(CFLAGS) -o $@ -c $< + +DO_AS=$(CC) $(CFLAGS) -DELF -x assembler-with-cpp -o $@ -c $< +DO_GL_AS=$(CC) $(CFLAGS) $(GLCFLAGS) -DELF -x assembler-with-cpp -o $@ -c $< + +############################################################################# +# SETUP AND BUILD +############################################################################# + +ifeq ($(ARCH),axp) +TARGETS=$(BUILDDIR)/qwsv +#$(BUILDDIR)/qwcl.x11 +else +#TARGETS=$(BUILDDIR)/qwsv $(BUILDDIR)/qwcl $(BUILDDIR)/qwcl.x11 $(BUILDDIR)/glqwcl $(BUILDDIR)/glqwcl.glx +# No OpenGL +TARGETS=$(BUILDDIR)/qwcl.x11 +#TARGETS=$(BUILDDIR)/qwsv $(BUILDDIR)/qwcl $(BUILDDIR)/qwcl.x11 +endif + +build_debug: + @-mkdir $(BUILD_DEBUG_DIR) \ + $(BUILD_DEBUG_DIR)/client \ + $(BUILD_DEBUG_DIR)/glclient \ + $(BUILD_DEBUG_DIR)/server + $(MAKE) targets BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)" + +build_release: + @-mkdir $(BUILD_RELEASE_DIR) \ + $(BUILD_RELEASE_DIR)/client \ + $(BUILD_RELEASE_DIR)/glclient \ + $(BUILD_RELEASE_DIR)/server + $(MAKE) targets BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(RELEASE_CFLAGS)" + +all: build_debug build_release + +targets: $(TARGETS) + +############################################################################# +# SERVER +############################################################################# + +QWSV_OBJS = \ + $(BUILDDIR)/server/pr_cmds.o \ + $(BUILDDIR)/server/pr_edict.o \ + $(BUILDDIR)/server/pr_exec.o \ + $(BUILDDIR)/server/sv_init.o \ + $(BUILDDIR)/server/sv_main.o \ + $(BUILDDIR)/server/sv_nchan.o \ + $(BUILDDIR)/server/sv_ents.o \ + $(BUILDDIR)/server/sv_send.o \ + $(BUILDDIR)/server/sv_move.o \ + $(BUILDDIR)/server/sv_phys.o \ + $(BUILDDIR)/server/sv_user.o \ + $(BUILDDIR)/server/sv_ccmds.o \ + $(BUILDDIR)/server/world.o \ + $(BUILDDIR)/server/sys_unix.o \ + $(BUILDDIR)/server/model.o \ + $(BUILDDIR)/server/cmd.o \ + $(BUILDDIR)/server/common.o \ + $(BUILDDIR)/server/crc.o \ + $(BUILDDIR)/server/cvar.o \ + $(BUILDDIR)/server/mathlib.o \ + $(BUILDDIR)/server/md4.o \ + $(BUILDDIR)/server/zone.o \ + $(BUILDDIR)/server/pmove.o \ + $(BUILDDIR)/server/pmovetst.o \ + $(BUILDDIR)/server/net_chan.o \ + $(BUILDDIR)/server/net_udp.o + +$(BUILDDIR)/qwsv : $(QWSV_OBJS) + $(CC) $(CFLAGS) -o $@ $(QWSV_OBJS) $(LDFLAGS) + +$(BUILDDIR)/server/pr_cmds.o : $(SERVER_DIR)/pr_cmds.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/pr_edict.o : $(SERVER_DIR)/pr_edict.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/pr_exec.o : $(SERVER_DIR)/pr_exec.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_init.o : $(SERVER_DIR)/sv_init.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_main.o : $(SERVER_DIR)/sv_main.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_nchan.o : $(SERVER_DIR)/sv_nchan.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_ents.o : $(SERVER_DIR)/sv_ents.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_send.o : $(SERVER_DIR)/sv_send.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_move.o : $(SERVER_DIR)/sv_move.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_phys.o : $(SERVER_DIR)/sv_phys.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_user.o : $(SERVER_DIR)/sv_user.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sv_ccmds.o : $(SERVER_DIR)/sv_ccmds.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/world.o : $(SERVER_DIR)/world.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/sys_unix.o : $(SERVER_DIR)/sys_unix.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/model.o : $(SERVER_DIR)/model.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/cmd.o : $(CLIENT_DIR)/cmd.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/common.o : $(CLIENT_DIR)/common.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/crc.o : $(CLIENT_DIR)/crc.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/cvar.o : $(CLIENT_DIR)/cvar.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/mathlib.o : $(CLIENT_DIR)/mathlib.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/md4.o : $(CLIENT_DIR)/md4.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/zone.o : $(CLIENT_DIR)/zone.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/pmove.o : $(CLIENT_DIR)/pmove.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/pmovetst.o : $(CLIENT_DIR)/pmovetst.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/net_chan.o : $(CLIENT_DIR)/net_chan.c + $(DO_SERVER_CC) + +$(BUILDDIR)/server/net_udp.o : $(CLIENT_DIR)/net_udp.c + $(DO_SERVER_CC) + +############################################################################# +# CLIENT +############################################################################# + +QWCL_OBJS = \ + $(BUILDDIR)/client/cl_demo.o \ + $(BUILDDIR)/client/cl_ents.o \ + $(BUILDDIR)/client/cl_input.o \ + $(BUILDDIR)/client/cl_main.o \ + $(BUILDDIR)/client/cl_parse.o \ + $(BUILDDIR)/client/cl_pred.o \ + $(BUILDDIR)/client/cl_tent.o \ + $(BUILDDIR)/client/cl_cam.o \ + $(BUILDDIR)/client/cmd.o \ + $(BUILDDIR)/client/common.o \ + $(BUILDDIR)/client/console.o \ + $(BUILDDIR)/client/crc.o \ + $(BUILDDIR)/client/cvar.o \ + $(BUILDDIR)/client/d_edge.o \ + $(BUILDDIR)/client/d_fill.o \ + $(BUILDDIR)/client/d_init.o \ + $(BUILDDIR)/client/d_modech.o \ + $(BUILDDIR)/client/d_part.o \ + $(BUILDDIR)/client/d_polyse.o \ + $(BUILDDIR)/client/d_scan.o \ + $(BUILDDIR)/client/d_sky.o \ + $(BUILDDIR)/client/d_sprite.o \ + $(BUILDDIR)/client/d_surf.o \ + $(BUILDDIR)/client/d_vars.o \ + $(BUILDDIR)/client/d_zpoint.o \ + $(BUILDDIR)/client/draw.o \ + $(BUILDDIR)/client/keys.o \ + $(BUILDDIR)/client/mathlib.o \ + $(BUILDDIR)/client/md4.o \ + $(BUILDDIR)/client/menu.o \ + $(BUILDDIR)/client/model.o \ + $(BUILDDIR)/client/net_chan.o \ + $(BUILDDIR)/client/net_udp.o \ + $(BUILDDIR)/client/nonintel.o \ + $(BUILDDIR)/client/pmove.o \ + $(BUILDDIR)/client/pmovetst.o \ + $(BUILDDIR)/client/r_aclip.o \ + $(BUILDDIR)/client/r_alias.o \ + $(BUILDDIR)/client/r_bsp.o \ + $(BUILDDIR)/client/r_draw.o \ + $(BUILDDIR)/client/r_edge.o \ + $(BUILDDIR)/client/r_efrag.o \ + $(BUILDDIR)/client/r_light.o \ + $(BUILDDIR)/client/r_main.o \ + $(BUILDDIR)/client/r_misc.o \ + $(BUILDDIR)/client/r_part.o \ + $(BUILDDIR)/client/r_sky.o \ + $(BUILDDIR)/client/r_sprite.o \ + $(BUILDDIR)/client/r_surf.o \ + $(BUILDDIR)/client/r_vars.o \ + $(BUILDDIR)/client/sbar.o \ + $(BUILDDIR)/client/screen.o \ + $(BUILDDIR)/client/skin.o \ + $(BUILDDIR)/client/snd_dma.o \ + $(BUILDDIR)/client/snd_mem.o \ + $(BUILDDIR)/client/snd_mix.o \ + $(BUILDDIR)/client/view.o \ + $(BUILDDIR)/client/wad.o \ + $(BUILDDIR)/client/zone.o \ + $(BUILDDIR)/client/cd_linux.o \ + $(BUILDDIR)/client/sys_linux.o \ + $(BUILDDIR)/client/snd_sdl.o \ + +# $(BUILDDIR)/client/snd_linux.o + +ifeq ($(ARCH),i386) + QWCL_AS_OBJS = \ + $(BUILDDIR)/client/d_copy.o \ + $(BUILDDIR)/client/d_draw.o \ + $(BUILDDIR)/client/d_draw16.o \ + $(BUILDDIR)/client/d_parta.o \ + $(BUILDDIR)/client/d_polysa.o \ + $(BUILDDIR)/client/d_scana.o \ + $(BUILDDIR)/client/d_spr8.o \ + $(BUILDDIR)/client/d_varsa.o \ + $(BUILDDIR)/client/math.o \ + $(BUILDDIR)/client/r_aclipa.o \ + $(BUILDDIR)/client/r_aliasa.o \ + $(BUILDDIR)/client/r_drawa.o \ + $(BUILDDIR)/client/r_edgea.o \ + $(BUILDDIR)/client/r_varsa.o \ + $(BUILDDIR)/client/snd_mixa.o \ + $(BUILDDIR)/client/surf16.o \ + $(BUILDDIR)/client/surf8.o \ + $(BUILDDIR)/client/sys_dosa.o +else + QWCL_AS_OBJS= +endif + +QWCL_SVGA_OBJS = $(BUILDDIR)/client/vid_svgalib.o +QWCL_X11_OBJS = $(BUILDDIR)/client/vid_x.o + +#$(QWCL_SVGA_OBJS) +$(BUILDDIR)/qwcl : $(QWCL_OBJS) $(QWCL_AS_OBJS) + $(CC) $(CFLAGS) -o $@ $(QWCL_OBJS) $(QWCL_AS_OBJS) \ + $(LDFLAGS) + +$(BUILDDIR)/qwcl.x11 : $(QWCL_OBJS) $(QWCL_AS_OBJS) $(QWCL_X11_OBJS) + $(CC) $(CFLAGS) -o $@ $(QWCL_OBJS) $(QWCL_AS_OBJS) $(QWCL_X11_OBJS) \ + $(LDFLAGS) $(XLDFLAGS) + +$(BUILDDIR)/client/cl_demo.o : $(CLIENT_DIR)/cl_demo.c + $(DO_CC) + +$(BUILDDIR)/client/cl_ents.o : $(CLIENT_DIR)/cl_ents.c + $(DO_CC) + +$(BUILDDIR)/client/cl_input.o : $(CLIENT_DIR)/cl_input.c + $(DO_CC) + +$(BUILDDIR)/client/cl_main.o : $(CLIENT_DIR)/cl_main.c + $(DO_CC) + +$(BUILDDIR)/client/cl_parse.o : $(CLIENT_DIR)/cl_parse.c + $(DO_CC) + +$(BUILDDIR)/client/cl_pred.o : $(CLIENT_DIR)/cl_pred.c + $(DO_CC) + +$(BUILDDIR)/client/cl_tent.o : $(CLIENT_DIR)/cl_tent.c + $(DO_CC) + +$(BUILDDIR)/client/cl_cam.o : $(CLIENT_DIR)/cl_cam.c + $(DO_CC) + +$(BUILDDIR)/client/cmd.o : $(CLIENT_DIR)/cmd.c + $(DO_CC) + +$(BUILDDIR)/client/common.o : $(CLIENT_DIR)/common.c + $(DO_CC) + +$(BUILDDIR)/client/console.o : $(CLIENT_DIR)/console.c + $(DO_CC) + +$(BUILDDIR)/client/crc.o : $(CLIENT_DIR)/crc.c + $(DO_CC) + +$(BUILDDIR)/client/cvar.o : $(CLIENT_DIR)/cvar.c + $(DO_CC) + +$(BUILDDIR)/client/d_edge.o : $(CLIENT_DIR)/d_edge.c + $(DO_CC) + +$(BUILDDIR)/client/d_fill.o : $(CLIENT_DIR)/d_fill.c + $(DO_CC) + +$(BUILDDIR)/client/d_init.o : $(CLIENT_DIR)/d_init.c + $(DO_CC) + +$(BUILDDIR)/client/d_modech.o : $(CLIENT_DIR)/d_modech.c + $(DO_CC) + +$(BUILDDIR)/client/d_part.o : $(CLIENT_DIR)/d_part.c + $(DO_CC) + +$(BUILDDIR)/client/d_polyse.o : $(CLIENT_DIR)/d_polyse.c + $(DO_CC) + +$(BUILDDIR)/client/d_scan.o : $(CLIENT_DIR)/d_scan.c + $(DO_CC) + +$(BUILDDIR)/client/d_sky.o : $(CLIENT_DIR)/d_sky.c + $(DO_CC) + +$(BUILDDIR)/client/d_sprite.o : $(CLIENT_DIR)/d_sprite.c + $(DO_CC) + +$(BUILDDIR)/client/d_surf.o : $(CLIENT_DIR)/d_surf.c + $(DO_CC) + +$(BUILDDIR)/client/d_vars.o : $(CLIENT_DIR)/d_vars.c + $(DO_CC) + +$(BUILDDIR)/client/d_zpoint.o : $(CLIENT_DIR)/d_zpoint.c + $(DO_CC) + +$(BUILDDIR)/client/draw.o : $(CLIENT_DIR)/draw.c + $(DO_CC) + +$(BUILDDIR)/client/keys.o : $(CLIENT_DIR)/keys.c + $(DO_CC) + +$(BUILDDIR)/client/mathlib.o : $(CLIENT_DIR)/mathlib.c + $(DO_CC) + +$(BUILDDIR)/client/md4.o : $(CLIENT_DIR)/md4.c + $(DO_CC) + +$(BUILDDIR)/client/menu.o : $(CLIENT_DIR)/menu.c + $(DO_CC) + +$(BUILDDIR)/client/model.o : $(CLIENT_DIR)/model.c + $(DO_CC) + +$(BUILDDIR)/client/net_chan.o : $(CLIENT_DIR)/net_chan.c + $(DO_CC) + +$(BUILDDIR)/client/net_udp.o : $(CLIENT_DIR)/net_udp.c + $(DO_CC) + +$(BUILDDIR)/client/nonintel.o : $(CLIENT_DIR)/nonintel.c + $(DO_CC) + +$(BUILDDIR)/client/pmove.o : $(CLIENT_DIR)/pmove.c + $(DO_CC) + +$(BUILDDIR)/client/pmovetst.o : $(CLIENT_DIR)/pmovetst.c + $(DO_CC) + +$(BUILDDIR)/client/r_aclip.o : $(CLIENT_DIR)/r_aclip.c + $(DO_CC) + +$(BUILDDIR)/client/r_alias.o : $(CLIENT_DIR)/r_alias.c + $(DO_CC) + +$(BUILDDIR)/client/r_bsp.o : $(CLIENT_DIR)/r_bsp.c + $(DO_CC) + +$(BUILDDIR)/client/r_draw.o : $(CLIENT_DIR)/r_draw.c + $(DO_CC) + +$(BUILDDIR)/client/r_edge.o : $(CLIENT_DIR)/r_edge.c + $(DO_CC) + +$(BUILDDIR)/client/r_efrag.o : $(CLIENT_DIR)/r_efrag.c + $(DO_CC) + +$(BUILDDIR)/client/r_light.o : $(CLIENT_DIR)/r_light.c + $(DO_CC) + +$(BUILDDIR)/client/r_main.o : $(CLIENT_DIR)/r_main.c + $(DO_CC) + +$(BUILDDIR)/client/r_misc.o : $(CLIENT_DIR)/r_misc.c + $(DO_CC) + +$(BUILDDIR)/client/r_part.o : $(CLIENT_DIR)/r_part.c + $(DO_CC) + +$(BUILDDIR)/client/r_sky.o : $(CLIENT_DIR)/r_sky.c + $(DO_CC) + +$(BUILDDIR)/client/r_sprite.o : $(CLIENT_DIR)/r_sprite.c + $(DO_CC) + +$(BUILDDIR)/client/r_surf.o : $(CLIENT_DIR)/r_surf.c + $(DO_CC) + +$(BUILDDIR)/client/r_vars.o : $(CLIENT_DIR)/r_vars.c + $(DO_CC) + +$(BUILDDIR)/client/sbar.o : $(CLIENT_DIR)/sbar.c + $(DO_CC) + +$(BUILDDIR)/client/screen.o : $(CLIENT_DIR)/screen.c + $(DO_CC) + +$(BUILDDIR)/client/skin.o : $(CLIENT_DIR)/skin.c + $(DO_CC) + +$(BUILDDIR)/client/snd_dma.o : $(CLIENT_DIR)/snd_dma.c + $(DO_CC) + +$(BUILDDIR)/client/snd_mem.o : $(CLIENT_DIR)/snd_mem.c + $(DO_CC) + +$(BUILDDIR)/client/snd_mix.o : $(CLIENT_DIR)/snd_mix.c + $(DO_CC) + +$(BUILDDIR)/client/view.o : $(CLIENT_DIR)/view.c + $(DO_CC) + +$(BUILDDIR)/client/wad.o : $(CLIENT_DIR)/wad.c + $(DO_CC) + +$(BUILDDIR)/client/zone.o : $(CLIENT_DIR)/zone.c + $(DO_CC) + +$(BUILDDIR)/client/cd_linux.o : $(CLIENT_DIR)/cd_linux.c + $(DO_CC) + +$(BUILDDIR)/client/sys_linux.o : $(CLIENT_DIR)/sys_linux.c + $(DO_CC) + +$(BUILDDIR)/client/snd_linux.o : $(CLIENT_DIR)/snd_linux.c + $(DO_CC) + +$(BUILDDIR)/client/snd_sdl.o : $(CLIENT_DIR)/snd_sdl.c + $(DO_CC) + +$(BUILDDIR)/client/d_copy.o : $(CLIENT_DIR)/d_copy.s + $(DO_AS) + +$(BUILDDIR)/client/d_draw.o : $(CLIENT_DIR)/d_draw.s + $(DO_AS) + +$(BUILDDIR)/client/d_draw16.o : $(CLIENT_DIR)/d_draw16.s + $(DO_AS) + +$(BUILDDIR)/client/d_parta.o : $(CLIENT_DIR)/d_parta.s + $(DO_AS) + +$(BUILDDIR)/client/d_polysa.o : $(CLIENT_DIR)/d_polysa.s + $(DO_AS) + +$(BUILDDIR)/client/d_scana.o : $(CLIENT_DIR)/d_scana.s + $(DO_AS) + +$(BUILDDIR)/client/d_spr8.o : $(CLIENT_DIR)/d_spr8.s + $(DO_AS) + +$(BUILDDIR)/client/d_varsa.o : $(CLIENT_DIR)/d_varsa.s + $(DO_AS) + +$(BUILDDIR)/client/math.o : $(CLIENT_DIR)/math.s + $(DO_AS) + +$(BUILDDIR)/client/r_aclipa.o : $(CLIENT_DIR)/r_aclipa.s + $(DO_AS) + +$(BUILDDIR)/client/r_aliasa.o : $(CLIENT_DIR)/r_aliasa.s + $(DO_AS) + +$(BUILDDIR)/client/r_drawa.o : $(CLIENT_DIR)/r_drawa.s + $(DO_AS) + +$(BUILDDIR)/client/r_edgea.o : $(CLIENT_DIR)/r_edgea.s + $(DO_AS) + +$(BUILDDIR)/client/r_varsa.o : $(CLIENT_DIR)/r_varsa.s + $(DO_AS) + +$(BUILDDIR)/client/snd_mixa.o : $(CLIENT_DIR)/snd_mixa.s + $(DO_AS) + +$(BUILDDIR)/client/surf16.o : $(CLIENT_DIR)/surf16.s + $(DO_AS) + +$(BUILDDIR)/client/surf8.o : $(CLIENT_DIR)/surf8.s + $(DO_AS) + +$(BUILDDIR)/client/sys_dosa.o : $(CLIENT_DIR)/sys_dosa.s + $(DO_AS) + +# $(BUILDDIR)/client/vid_svgalib.o : $(CLIENT_DIR)/vid_svgalib.c +# $(DO_O_CC) + +$(BUILDDIR)/client/vid_x.o : $(CLIENT_DIR)/vid_x.c + $(DO_CC) + +############################################################################# +# GL CLIENT +############################################################################# + +GLQWCL_OBJS = \ + $(BUILDDIR)/glclient/cl_demo.o \ + $(BUILDDIR)/glclient/cl_ents.o \ + $(BUILDDIR)/glclient/cl_input.o \ + $(BUILDDIR)/glclient/cl_main.o \ + $(BUILDDIR)/glclient/cl_parse.o \ + $(BUILDDIR)/glclient/cl_pred.o \ + $(BUILDDIR)/glclient/cl_tent.o \ + $(BUILDDIR)/glclient/cl_cam.o \ + $(BUILDDIR)/glclient/cmd.o \ + $(BUILDDIR)/glclient/common.o \ + $(BUILDDIR)/glclient/console.o \ + $(BUILDDIR)/glclient/crc.o \ + $(BUILDDIR)/glclient/cvar.o \ + $(BUILDDIR)/glclient/keys.o \ + $(BUILDDIR)/glclient/mathlib.o \ + $(BUILDDIR)/glclient/md4.o \ + $(BUILDDIR)/glclient/menu.o \ + $(BUILDDIR)/glclient/net_chan.o \ + $(BUILDDIR)/glclient/net_udp.o \ + $(BUILDDIR)/glclient/nonintel.o \ + $(BUILDDIR)/glclient/pmove.o \ + $(BUILDDIR)/glclient/pmovetst.o \ + $(BUILDDIR)/glclient/r_part.o \ + $(BUILDDIR)/glclient/sbar.o \ + $(BUILDDIR)/glclient/skin.o \ + $(BUILDDIR)/glclient/snd_dma.o \ + $(BUILDDIR)/glclient/snd_mem.o \ + $(BUILDDIR)/glclient/snd_mix.o \ + $(BUILDDIR)/glclient/view.o \ + $(BUILDDIR)/glclient/wad.o \ + $(BUILDDIR)/glclient/zone.o \ + $(BUILDDIR)/glclient/cd_linux.o \ + $(BUILDDIR)/glclient/sys_linux.o \ + $(BUILDDIR)/glclient/snd_sdl.o \ + \ + $(BUILDDIR)/glclient/gl_draw.o \ + $(BUILDDIR)/glclient/gl_mesh.o \ + $(BUILDDIR)/glclient/gl_model.o \ + $(BUILDDIR)/glclient/gl_ngraph.o \ + $(BUILDDIR)/glclient/gl_refrag.o \ + $(BUILDDIR)/glclient/gl_rlight.o \ + $(BUILDDIR)/glclient/gl_rmain.o \ + $(BUILDDIR)/glclient/gl_rmisc.o \ + $(BUILDDIR)/glclient/gl_rsurf.o \ + $(BUILDDIR)/glclient/gl_screen.o \ + $(BUILDDIR)/glclient/gl_warp.o \ + \ + $(BUILDDIR)/glclient/math.o \ + $(BUILDDIR)/glclient/snd_mixa.o \ + $(BUILDDIR)/glclient/sys_dosa.o + + +# $(BUILDDIR)/glclient/snd_linux.o + +GLQWCL_SVGA_OBJS = $(BUILDDIR)/glclient/gl_vidlinux.o +GLQWCL_X11_OBJS = $(BUILDDIR)/glclient/gl_vidlinuxglx.o + +# $(GLQWCL_SVGA_OBJS) +#$(GL_SVGA_LDFLAGS) +#$(GL_SVGA_LDFLAGS) +$(BUILDDIR)/glqwcl : $(GLQWCL_OBJS) + $(CC) $(CFLAGS) -o $@ $(GLQWCL_OBJS) $(LDFLAGS) + +$(BUILDDIR)/glqwcl.glx : $(GLQWCL_OBJS) $(GLQWCL_X11_OBJS) + $(CC) $(CFLAGS) -o $@ $(GLQWCL_OBJS) $(GLQWCL_X11_OBJS) $(LDFLAGS) $(GL_X11_LDFLAGS) + +$(BUILDDIR)/glclient/cl_demo.o : $(CLIENT_DIR)/cl_demo.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cl_ents.o : $(CLIENT_DIR)/cl_ents.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cl_input.o : $(CLIENT_DIR)/cl_input.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cl_main.o : $(CLIENT_DIR)/cl_main.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cl_parse.o : $(CLIENT_DIR)/cl_parse.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cl_pred.o : $(CLIENT_DIR)/cl_pred.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cl_tent.o : $(CLIENT_DIR)/cl_tent.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cl_cam.o : $(CLIENT_DIR)/cl_cam.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cmd.o : $(CLIENT_DIR)/cmd.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/common.o : $(CLIENT_DIR)/common.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/console.o : $(CLIENT_DIR)/console.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/crc.o : $(CLIENT_DIR)/crc.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cvar.o : $(CLIENT_DIR)/cvar.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/keys.o : $(CLIENT_DIR)/keys.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/mathlib.o : $(CLIENT_DIR)/mathlib.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/md4.o : $(CLIENT_DIR)/md4.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/menu.o : $(CLIENT_DIR)/menu.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/net_chan.o : $(CLIENT_DIR)/net_chan.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/net_udp.o : $(CLIENT_DIR)/net_udp.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/nonintel.o : $(CLIENT_DIR)/nonintel.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/pmove.o : $(CLIENT_DIR)/pmove.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/pmovetst.o : $(CLIENT_DIR)/pmovetst.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/r_part.o : $(CLIENT_DIR)/r_part.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/sbar.o : $(CLIENT_DIR)/sbar.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/screen.o : $(CLIENT_DIR)/screen.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/skin.o : $(CLIENT_DIR)/skin.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/snd_dma.o : $(CLIENT_DIR)/snd_dma.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/snd_mem.o : $(CLIENT_DIR)/snd_mem.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/snd_mix.o : $(CLIENT_DIR)/snd_mix.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/view.o : $(CLIENT_DIR)/view.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/wad.o : $(CLIENT_DIR)/wad.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/zone.o : $(CLIENT_DIR)/zone.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/cd_linux.o : $(CLIENT_DIR)/cd_linux.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/sys_linux.o : $(CLIENT_DIR)/sys_linux.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/snd_linux.o : $(CLIENT_DIR)/snd_linux.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/snd_sdl.o : $(CLIENT_DIR)/snd_sdl.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_draw.o : $(CLIENT_DIR)/gl_draw.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_mesh.o : $(CLIENT_DIR)/gl_mesh.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_model.o : $(CLIENT_DIR)/gl_model.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_ngraph.o : $(CLIENT_DIR)/gl_ngraph.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_refrag.o : $(CLIENT_DIR)/gl_refrag.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_rlight.o : $(CLIENT_DIR)/gl_rlight.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_rmain.o : $(CLIENT_DIR)/gl_rmain.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_rmisc.o : $(CLIENT_DIR)/gl_rmisc.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_rsurf.o : $(CLIENT_DIR)/gl_rsurf.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_screen.o : $(CLIENT_DIR)/gl_screen.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_vidlinux.o : $(CLIENT_DIR)/gl_vidlinux.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_vidlinuxglx.o : $(CLIENT_DIR)/gl_vidlinuxglx.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/gl_warp.o : $(CLIENT_DIR)/gl_warp.c + $(DO_GL_CC) + +$(BUILDDIR)/glclient/math.o : $(CLIENT_DIR)/math.s + $(DO_GL_AS) + +$(BUILDDIR)/glclient/snd_mixa.o : $(CLIENT_DIR)/snd_mixa.s + $(DO_GL_AS) + +$(BUILDDIR)/glclient/sys_dosa.o : $(CLIENT_DIR)/sys_dosa.s + $(DO_GL_AS) + +############################################################################# +# RPM +############################################################################# + +# Make RPMs. You need to be root to make this work +RPMROOT=/usr/src/redhat +RPM = rpm +RPMFLAGS = -bb +INSTALLDIR = /usr/local/games/quake + +ifeq ($(ARCH),axp) +rpm: rpm-qwsv +tar: tar-qwsv +else +rpm: rpm-qwcl rpm-qwsv +tar: tar-qwcl tar-qwsv +endif + +QWCL_RPMDIR=/var/tmp/qwcl-$(VERSION) +TDFXGL_DIR=/home/zoid/3dfxgl + +QWPROGS = \ + $(MAINDIR)/progs/buttons.qc \ + $(MAINDIR)/progs/client.qc \ + $(MAINDIR)/progs/combat.qc \ + $(MAINDIR)/progs/defs.qc \ + $(MAINDIR)/progs/doors.qc \ + $(MAINDIR)/progs/items.qc \ + $(MAINDIR)/progs/misc.qc \ + $(MAINDIR)/progs/models.qc \ + $(MAINDIR)/progs/plats.qc \ + $(MAINDIR)/progs/player.qc \ + $(MAINDIR)/progs/progdefs.h \ + $(MAINDIR)/progs/progs.src \ + $(MAINDIR)/progs/qwprogs.dat \ + $(MAINDIR)/progs/server.qc \ + $(MAINDIR)/progs/spectate.qc \ + $(MAINDIR)/progs/sprites.qc \ + $(MAINDIR)/progs/subs.qc \ + $(MAINDIR)/progs/triggers.qc \ + $(MAINDIR)/progs/weapons.qc \ + $(MAINDIR)/progs/world.qc + +rpm-qwcl: qwcl.spec \ + $(BUILD_RELEASE_DIR)/qwcl \ + $(BUILD_RELEASE_DIR)/glqwcl \ + $(BUILD_RELEASE_DIR)/glqwcl.glx \ + $(BUILD_RELEASE_DIR)/qwcl.x11 + touch $(RPMROOT)/SOURCES/qwcl-$(VERSION).tar.gz + if [ ! -d archives ];then mkdir archives;fi + $(MAKE) copyfiles-qwcl DESTDIR=$(QWCL_RPMDIR)/$(INSTALLDIR) + cp qwcl.spec $(RPMROOT)/SPECS/qwcl.spec + cp $(MAINDIR)/quake.gif $(RPMROOT)/SOURCES/quake.gif + cd $(RPMROOT)/SPECS; $(RPM) $(RPMFLAGS) qwcl.spec + cp $(RPMROOT)/RPMS/$(RPMARCH)/qwcl-$(VERSION)-$(RPM_RELEASE).$(RPMARCH).rpm archives/. + rm -rf $(QWCL_RPMDIR) + +tar-qwcl: $(BUILD_RELEASE_DIR)/qwcl \ + $(BUILD_RELEASE_DIR)/glqwcl \ + $(BUILD_RELEASE_DIR)/glqwcl.glx \ + $(BUILD_RELEASE_DIR)/qwcl.x11 + if [ ! -d archives ];then mkdir archives;fi + $(MAKE) copyfiles-qwcl DESTDIR=$(QWCL_RPMDIR)/$(INSTALLDIR) + cd $(QWCL_RPMDIR)/$(INSTALLDIR); tar czvf qwcl-$(VERSION)-$(RPMARCH)-unknown-linux2.0.tar.gz * + mv $(QWCL_RPMDIR)/$(INSTALLDIR)/*.tar.gz archives/. + rm -rf $(QWCL_RPMDIR) + +copyfiles-qwcl: + -mkdirhier $(DESTDIR) + -mkdirhier $(DESTDIR)/qw + -mkdirhier $(DESTDIR)/qw/skins + cp $(BUILD_RELEASE_DIR)/qwcl $(DESTDIR)/. + strip $(DESTDIR)/qwcl + chmod 4755 $(DESTDIR)/qwcl + cp $(BUILD_RELEASE_DIR)/qwcl.x11 $(DESTDIR)/. + strip $(DESTDIR)/qwcl.x11 + chmod 755 $(DESTDIR)/qwcl.x11 + cp $(BUILD_RELEASE_DIR)/glqwcl $(DESTDIR)/. + strip $(DESTDIR)/glqwcl + chmod 4755 $(DESTDIR)/glqwcl + cp $(BUILD_RELEASE_DIR)/glqwcl.glx $(DESTDIR)/. + strip $(DESTDIR)/glqwcl.glx + chmod 4755 $(DESTDIR)/glqwcl.glx + cp $(TDFXGL_DIR)/release$(ARCH)/lib3dfxgl.so $(DESTDIR)/. + chmod 755 $(DESTDIR)/lib3dfxgl.so + cp $(MAINDIR)/glqwcl.3dfxgl $(DESTDIR)/. + chmod 755 $(DESTDIR)/glqwcl.3dfxgl + cp $(MAINDIR)/docs/README.qwcl $(DESTDIR)/. + chmod 644 $(DESTDIR)/README.qwcl + cp $(MAINDIR)/fixskins.sh $(DESTDIR)/qw/skins/. + chmod 755 $(DESTDIR)/qw/skins/fixskins.sh + cp $(MESA_DIR)/lib/libMesaGL.so.2.6 $(DESTDIR) + chmod 755 $(DESTDIR)/libMesaGL.so.2.6 + cd $(DESTDIR); ln -sf libMesaGL.so.2.6 libMesaGL.so.2 + cd $(DESTDIR); ln -sf libMesaGL.so.2 libMesaGL.so + cd $(DESTDIR); ln -sf libMesaGL.so libGL.so + +qwcl.spec : $(MAINDIR)/qwcl.spec.sh $(BUILD_RELEASE_DIR)/qwcl + sh $< $(VERSION) $(RPM_RELEASE) $(INSTALLDIR) > $@ + +QWSV_RPMDIR=/var/tmp/qwsv-$(VERSION) +rpm-qwsv: qwsv.spec $(BUILD_RELEASE_DIR)/qwsv $(QWPROGS) + touch $(RPMROOT)/SOURCES/qwsv-$(VERSION).tar.gz + if [ ! -d archives ];then mkdir archives;fi + $(MAKE) copyfiles-qwsv DESTDIR=$(QWSV_RPMDIR)/$(INSTALLDIR) + cp qwsv.spec $(RPMROOT)/SPECS/qwsv.spec + cp $(MAINDIR)/quake.gif $(RPMROOT)/SOURCES/quake.gif + cd $(RPMROOT)/SPECS; $(RPM) $(RPMFLAGS) qwsv.spec + cp $(RPMROOT)/RPMS/$(RPMARCH)/qwsv-$(VERSION)-$(RPM_RELEASE).$(RPMARCH).rpm archives/. + rm -rf $(QWSV_RPMDIR) + +tar-qwsv: $(BUILD_RELEASE_DIR)/qwsv $(QWPROGS) + if [ ! -d archives ];then mkdir archives;fi + $(MAKE) copyfiles-qwsv DESTDIR=$(QWSV_RPMDIR)/$(INSTALLDIR) + cd $(QWSV_RPMDIR)/$(INSTALLDIR); tar czvf qwsv-$(VERSION)-$(RPMARCH)-unknown-linux2.0.tar.gz * + mv $(QWSV_RPMDIR)/$(INSTALLDIR)/*.tar.gz archives/. + rm -rf $(QWSV_RPMDIR) + +copyfiles-qwsv: + -mkdirhier $(DESTDIR) + -mkdirhier $(DESTDIR)/qw + -mkdirhier $(DESTDIR)/qw/skins + cp $(BUILD_RELEASE_DIR)/qwsv $(DESTDIR)/. + strip $(DESTDIR)/qwsv + chmod 755 $(DESTDIR)/qwsv + cp $(MAINDIR)/docs/README.qwsv $(DESTDIR)/. + chmod 644 $(DESTDIR)/README.qwsv + cp $(QWPROGS) $(DESTDIR)/qw/. + cd $(DESTDIR)/qw; chmod 644 * + chmod 755 $(DESTDIR)/qw/skins + cp $(MAINDIR)/fixskins.sh $(DESTDIR)/qw/skins/. + chmod 755 $(DESTDIR)/qw/skins/fixskins.sh + +qwsv.spec : $(MAINDIR)/qwsv.spec.sh $(BUILD_RELEASE_DIR)/qwsv + sh $< $(VERSION) $(RPM_RELEASE) $(INSTALLDIR) > $@ + +############################################################################# +# MISC +############################################################################# + +clean: clean-debug clean-release + +clean-debug: + $(MAKE) clean2 BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)" + +clean-release: + $(MAKE) clean2 BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(DEBUG_CFLAGS)" + +clean2: + -rm -f $(QWSV_OBJS) \ + $(QWCL_OBJS) \ + $(QWCL_AS_OBJS) \ + $(QWCL_SVGA_OBJS) \ + $(QWCL_X11_OBJS) \ + $(GLQWCL_OBJS) \ + diff --git a/QW/client/cvar.h b/QW/client/cvar.h index bc72791..58b4e41 100644 --- a/QW/client/cvar.h +++ b/QW/client/cvar.h @@ -53,6 +53,12 @@ Cvars are restricted from having the same names as commands to keep this interface from being ambiguous. */ +/* for sdl */ +#if defined(USE_SDL2) +#define CVAR_NONE 0 +#endif +/* sdl end */ + typedef struct cvar_s { char *name; diff --git a/QW/client/snd_dma.c b/QW/client/snd_dma.c index 4168315..8554836 100644 --- a/QW/client/snd_dma.c +++ b/QW/client/snd_dma.c @@ -77,6 +77,11 @@ cvar_t volume = {"volume", "0.7", true}; cvar_t nosound = {"nosound", "0"}; cvar_t precache = {"precache", "1"}; cvar_t loadas8bit = {"loadas8bit", "0"}; +/* for sdl */ +#if defined(USE_SDL2) +cvar_t sndspeed = {"sndspeed", "11025", CVAR_NONE}; +cvar_t snd_mixspeed = {"snd_mixspeed", "44100", CVAR_NONE}; +#endif cvar_t bgmbuffer = {"bgmbuffer", "4096"}; cvar_t ambient_level = {"ambient_level", "0.3"}; cvar_t ambient_fade = {"ambient_fade", "100"}; @@ -146,8 +151,13 @@ void S_Startup (void) if (!fakedma) { +#if defined(USE_SDL2) + /* Since I borrowed a lot of the SDL2 code from Quakespasm, I + found this to be the easiest way to retrofit it: */ + rc = SNDDMA_Init(&sn); +#else rc = SNDDMA_Init(); - +#endif if (!rc) { #ifndef _WIN32 diff --git a/QW/client/snd_sdl.c b/QW/client/snd_sdl.c new file mode 100644 index 0000000..a65758c --- /dev/null +++ b/QW/client/snd_sdl.c @@ -0,0 +1,215 @@ +/* + * snd_sdl.c - SDL audio driver for Hexen II: Hammer of Thyrion (uHexen2) + * based on implementations found in the quakeforge and ioquake3 projects. + * + * Copyright (C) 1999-2005 Id Software, Inc. + * Copyright (C) 2005-2012 O.Sezer <sezero@users.sourceforge.net> + * Copyright (C) 2010-2014 QuakeSpasm developers + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any lat er version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "quakedef.h" + +#if defined(SDL_FRAMEWORK) || defined(NO_SDL_CONFIG) +#if defined(USE_SDL2) +#include <SDL2/SDL.h> +#else +#include <SDL/SDL.h> +#endif +#else +#include "SDL.h" +#endif + +static int buffersize; + + +static void SDLCALL paint_audio (void *unused, Uint8 *stream, int len) +{ + int pos, tobufend; + int len1, len2; + + if (!shm) + { /* shouldn't happen, but just in case */ + memset(stream, 0, len); + return; + } + + pos = (shm->samplepos * (shm->samplebits / 8)); + if (pos >= buffersize) + shm->samplepos = pos = 0; + + tobufend = buffersize - pos; /* bytes to buffer's end. */ + len1 = len; + len2 = 0; + + if (len1 > tobufend) + { + len1 = tobufend; + len2 = len - len1; + } + + memcpy(stream, shm->buffer + pos, len1); + + if (len2 <= 0) + { + shm->samplepos += (len1 / (shm->samplebits / 8)); + } + else + { /* wraparound? */ + memcpy(stream + len1, shm->buffer, len2); + shm->samplepos = (len2 / (shm->samplebits / 8)); + } + + if (shm->samplepos >= buffersize) + shm->samplepos = 0; +} + +qboolean SNDDMA_Init (dma_t *dma) +{ + SDL_AudioSpec desired; + int tmp, val; + char drivername[128]; + + if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) + { + Con_Printf("Couldn't init SDL audio: %s\n", SDL_GetError()); + return false; + } + + /* Set up the desired format */ +/* desired.freq = snd_mixspeed.value;*/ + desired.freq = 44100; + desired.format = (loadas8bit.value) ? AUDIO_U8 : AUDIO_S16SYS; + desired.channels = 2; /* = desired_channels; */ + if (desired.freq <= 11025) + desired.samples = 256; + else if (desired.freq <= 22050) + desired.samples = 512; + else if (desired.freq <= 44100) + desired.samples = 1024; + else if (desired.freq <= 56000) + desired.samples = 2048; /* for 48 kHz */ + else + desired.samples = 4096; /* for 96 kHz */ + desired.callback = paint_audio; + desired.userdata = NULL; + + /* Open the audio device */ + if (SDL_OpenAudio(&desired, NULL) == -1) + { + Con_Printf("Couldn't open SDL audio: %s\n", SDL_GetError()); + SDL_QuitSubSystem(SDL_INIT_AUDIO); + return false; + } + /* i think i'm just zeroing dma mem here */ + memset ((void *) dma, 0, sizeof(dma_t)); + /*shm = dma;*/ + shm = &sn; + + /* Fill the audio DMA information block */ + /* Since we passed NULL as the 'obtained' spec to SDL_OpenAudio(), + * SDL will convert to hardware format for us if needed, hence we + * directly use the desired values here. */ + shm->samplebits = (desired.format & 0xFF); /* first byte of format is bits */ +/* shm->signed8 = (desired.format == AUDIO_S8);*/ + shm->speed = desired.freq; + shm->channels = desired.channels; + tmp = (desired.samples * desired.channels) * 10; + if (tmp & (tmp - 1)) + { /* make it a power of two */ + val = 1; + while (val < tmp) + val <<= 1; + + tmp = val; + } + shm->samples = tmp; + shm->samplepos = 0; + shm->submission_chunk = 1; + + Con_Printf ("SDL audio spec : %d Hz, %d samples, %d channels\n", + desired.freq, desired.samples, desired.channels); +#if defined(USE_SDL2) + { + const char *driver = SDL_GetCurrentAudioDriver(); + const char *device = SDL_GetAudioDeviceName(0, SDL_FALSE); + snprintf(drivername, sizeof(drivername), "%s - %s", + driver != NULL ? driver : "(UNKNOWN)", + device != NULL ? device : "(UNKNOWN)"); + } +#else + if (SDL_AudioDriverName(drivername, sizeof(drivername)) == NULL) + strcpy(drivername, "(UNKNOWN)"); +#endif + buffersize = shm->samples * (shm->samplebits / 8); + Con_Printf ("SDL audio driver: %s, %d bytes buffer\n", drivername, buffersize); + + shm->buffer = (unsigned char *) calloc (1, buffersize); +// if (!shm->buffer) + if (!shm->buffer || shm->buffer == (unsigned char *)-1) + { + SDL_CloseAudio(); + SDL_QuitSubSystem(SDL_INIT_AUDIO); + shm = NULL; + Con_Printf ("Failed allocating memory for SDL audio\n"); + return false; + } + + SDL_PauseAudio(0); + + return true; +} + +int SNDDMA_GetDMAPos (void) +{ + return shm->samplepos; +} + +void SNDDMA_Shutdown (void) +{ + if (shm) + { + Con_Printf ("Shutting down SDL sound\n"); + SDL_CloseAudio(); + SDL_QuitSubSystem(SDL_INIT_AUDIO); + if (shm->buffer) + free (shm->buffer); + shm->buffer = NULL; + shm = NULL; + } +} + +void SNDDMA_LockBuffer (void) +{ + SDL_LockAudio (); +} + +void SNDDMA_Submit (void) +{ + SDL_UnlockAudio(); +} + +void SNDDMA_BlockSound (void) +{ + SDL_PauseAudio(1); +} + +void SNDDMA_UnblockSound (void) +{ + SDL_PauseAudio(0); +} + diff --git a/QW/client/sound.h b/QW/client/sound.h index 941e620..c1e90fa 100644 --- a/QW/client/sound.h +++ b/QW/client/sound.h @@ -111,9 +111,14 @@ channel_t *SND_PickChannel(int entnum, int entchannel); // spatializes a channel void SND_Spatialize(channel_t *ch); +#if defined(USE_SDL2) +/* Probably the easiest way to retrofit quakespasm's SDL2 audio code into + Id Quake. */ +qboolean SNDDMA_Init(dma_t *dma); +#else // initializes cycling through a DMA buffer and returns information on it qboolean SNDDMA_Init(void); - +#endif // gets the current DMA position int SNDDMA_GetDMAPos(void); diff --git a/QW/client/vid_x.c b/QW/client/vid_x.c index 891fb3b..c96545c 100644 --- a/QW/client/vid_x.c +++ b/QW/client/vid_x.c @@ -21,7 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define _BSD -typedef unsigned short PIXEL; #include <ctype.h> #include <sys/time.h> @@ -50,7 +49,6 @@ float old_windowed_mouse; int VGA_width, VGA_height, VGA_rowbytes, VGA_bufferrowbytes, VGA_planar; byte *VGA_pagebase; - qboolean mouse_avail; int mouse_buttons=3; int mouse_oldbuttonstate; @@ -112,7 +110,10 @@ void (*vid_menudrawfn)(void); void (*vid_menukeyfn)(int key); void VID_MenuKey (int key); -static PIXEL st2d_8to16table[256]; +typedef unsigned short PIXEL16; +typedef unsigned long PIXEL24; +static PIXEL16 st2d_8to16table[256]; +static PIXEL24 st2d_8to24table[256]; static int shiftmask_fl=0; static long r_shift,g_shift,b_shift; static unsigned long r_mask,g_mask,b_mask; @@ -129,9 +130,36 @@ void shiftmask_init() shiftmask_fl=1; } -PIXEL xlib_rgb(int r,int g,int b) +PIXEL16 xlib_rgb16(int r,int g,int b) +{ + PIXEL16 p; + if(shiftmask_fl==0) shiftmask_init(); + p=0; + + if(r_shift>0) { + p=(r<<(r_shift))&r_mask; + } else if(r_shift<0) { + p=(r>>(-r_shift))&r_mask; + } else p|=(r&r_mask); + + if(g_shift>0) { + p|=(g<<(g_shift))&g_mask; + } else if(g_shift<0) { + p|=(g>>(-g_shift))&g_mask; + } else p|=(g&g_mask); + + if(b_shift>0) { + p|=(b<<(b_shift))&b_mask; + } else if(b_shift<0) { + p|=(b>>(-b_shift))&b_mask; + } else p|=(b&b_mask); + + return p; +} + +PIXEL24 xlib_rgb24(int r,int g,int b) { - PIXEL p; + PIXEL24 p; if(shiftmask_fl==0) shiftmask_init(); p=0; @@ -160,16 +188,71 @@ void st2_fixup( XImage *framebuf, int x, int y, int width, int height) { int xi,yi; unsigned char *src; - PIXEL *dest; + PIXEL16 *dest; + register int count, n; if( (x<0)||(y<0) )return; for (yi = y; yi < (y+height); yi++) { src = &framebuf->data [yi * framebuf->bytes_per_line]; - dest = (PIXEL*)src; - for(xi = (x+width-1); xi >= x; xi--) { - dest[xi] = st2d_8to16table[src[xi]]; + + // Duff's Device + count = width; + n = (count + 7) / 8; + dest = ((PIXEL16 *)src) + x+width - 1; + src += x+width - 1; + + switch (count % 8) { + case 0: do { *dest-- = st2d_8to16table[*src--]; + case 7: *dest-- = st2d_8to16table[*src--]; + case 6: *dest-- = st2d_8to16table[*src--]; + case 5: *dest-- = st2d_8to16table[*src--]; + case 4: *dest-- = st2d_8to16table[*src--]; + case 3: *dest-- = st2d_8to16table[*src--]; + case 2: *dest-- = st2d_8to16table[*src--]; + case 1: *dest-- = st2d_8to16table[*src--]; + } while (--n > 0); } + +// for(xi = (x+width-1); xi >= x; xi--) { +// dest[xi] = st2d_8to16table[src[xi]]; +// } + } +} + +void st3_fixup( XImage *framebuf, int x, int y, int width, int height) +{ + int xi,yi; + unsigned char *src; + PIXEL24 *dest; + register int count, n; + + if( (x<0)||(y<0) )return; + + for (yi = y; yi < (y+height); yi++) { + src = &framebuf->data [yi * framebuf->bytes_per_line]; + + // Duff's Device + count = width; + n = (count + 7) / 8; + dest = ((PIXEL24 *)src) + x+width - 1; + src += x+width - 1; + + switch (count % 8) { + case 0: do { *dest-- = st2d_8to24table[*src--]; + case 7: *dest-- = st2d_8to24table[*src--]; + case 6: *dest-- = st2d_8to24table[*src--]; + case 5: *dest-- = st2d_8to24table[*src--]; + case 4: *dest-- = st2d_8to24table[*src--]; + case 3: *dest-- = st2d_8to24table[*src--]; + case 2: *dest-- = st2d_8to24table[*src--]; + case 1: *dest-- = st2d_8to24table[*src--]; + } while (--n > 0); + } + +// for(xi = (x+width-1); xi >= x; xi--) { +// dest[xi] = st2d_8to16table[src[xi]]; +// } } } @@ -367,8 +450,6 @@ void VID_Init (unsigned char *palette) XVisualInfo template; int num_visuals; int template_mask; - - S_Init(); ignorenext=0; vid.width = 320; @@ -517,20 +598,17 @@ void VID_Init (unsigned char *palette) if (x_visinfo->class != TrueColor) XFreeColormap(x_disp, tmpcmap); - } if (x_visinfo->depth == 8) { - - // create and upload the palette + // create and upload the palette if (x_visinfo->class == PseudoColor) { x_cmap = XCreateColormap(x_disp, x_win, x_vis, AllocAll); VID_SetPalette(palette); XSetWindowColormap(x_disp, x_win, x_cmap); } - } // inviso cursor @@ -610,9 +688,10 @@ void VID_SetPalette(unsigned char *palette) int i; XColor colors[256]; - for(i=0;i<256;i++) - st2d_8to16table[i]= xlib_rgb(palette[i*3], - palette[i*3+1],palette[i*3+2]); + for(i=0;i<256;i++) { + st2d_8to16table[i]= xlib_rgb16(palette[i*3], palette[i*3+1],palette[i*3+2]); + st2d_8to24table[i]= xlib_rgb24(palette[i*3], palette[i*3+1],palette[i*3+2]); + } if (x_visinfo->class == PseudoColor && x_visinfo->depth == 8) { @@ -881,6 +960,7 @@ void GetEvent(void) void VID_Update (vrect_t *rects) { + vrect_t full; // if the window changes dimension, skip this frame @@ -906,15 +986,27 @@ void VID_Update (vrect_t *rects) return; } + // force full update if not 8bit + if (x_visinfo->depth != 8) { + extern int scr_fullupdate; + + scr_fullupdate = 0; + } + + if (doShm) { while (rects) { - if (x_visinfo->depth != 8) + if (x_visinfo->depth == 16) st2_fixup( x_framebuffer[current_framebuffer], rects->x, rects->y, rects->width, rects->height); + else if (x_visinfo->depth == 24) + st3_fixup( x_framebuffer[current_framebuffer], + rects->x, rects->y, rects->width, + rects->height); if (!XShmPutImage(x_disp, x_win, x_gc, x_framebuffer[current_framebuffer], rects->x, rects->y, rects->x, rects->y, rects->width, rects->height, True)) @@ -932,10 +1024,14 @@ void VID_Update (vrect_t *rects) { while (rects) { - if (x_visinfo->depth != 8) + if (x_visinfo->depth == 16) st2_fixup( x_framebuffer[current_framebuffer], rects->x, rects->y, rects->width, rects->height); + else if (x_visinfo->depth == 24) + st3_fixup( x_framebuffer[current_framebuffer], + rects->x, rects->y, rects->width, + rects->height); XPutImage(x_disp, x_win, x_gc, x_framebuffer[0], rects->x, rects->y, rects->x, rects->y, rects->width, rects->height); rects = rects->pnext; diff --git a/QW/vid_x.c b/QW/vid_x.c new file mode 100644 index 0000000..891fb3b --- /dev/null +++ b/QW/vid_x.c @@ -0,0 +1,1116 @@ +/* +Copyright (C) 1996-1997 Id Software, Inc. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ +// vid_x.c -- general x video driver + +#define _BSD + +typedef unsigned short PIXEL; + +#include <ctype.h> +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> +#include <signal.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/ipc.h> +#include <sys/shm.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xatom.h> +#include <X11/keysym.h> +#include <X11/extensions/XShm.h> + +#include "quakedef.h" +#include "d_local.h" + +cvar_t _windowed_mouse = {"_windowed_mouse","0", true}; +cvar_t m_filter = {"m_filter","0", true}; +float old_windowed_mouse; + +// not used +int VGA_width, VGA_height, VGA_rowbytes, VGA_bufferrowbytes, VGA_planar; +byte *VGA_pagebase; + + +qboolean mouse_avail; +int mouse_buttons=3; +int mouse_oldbuttonstate; +int mouse_buttonstate; +float mouse_x, mouse_y; +float old_mouse_x, old_mouse_y; +int p_mouse_x; +int p_mouse_y; +int ignorenext; +int bits_per_pixel; + +typedef struct +{ + int input; + int output; +} keymap_t; + +viddef_t vid; // global video state +unsigned short d_8to16table[256]; + +int num_shades=32; + +int d_con_indirect = 0; + +int vid_buffersize; + +static qboolean doShm; +static Display *x_disp; +static Colormap x_cmap; +static Window x_win; +static GC x_gc; +static Visual *x_vis; +static XVisualInfo *x_visinfo; +//static XImage *x_image; + +static int x_shmeventtype; +//static XShmSegmentInfo x_shminfo; + +static qboolean oktodraw = false; + +int XShmQueryExtension(Display *); +int XShmGetEventBase(Display *); + +int current_framebuffer; +static XImage *x_framebuffer[2] = { 0, 0 }; +static XShmSegmentInfo x_shminfo[2]; + +static int verbose=0; + +static byte current_palette[768]; + +static long X11_highhunkmark; +static long X11_buffersize; + +int vid_surfcachesize; +void *vid_surfcache; + +void (*vid_menudrawfn)(void); +void (*vid_menukeyfn)(int key); +void VID_MenuKey (int key); + +static PIXEL st2d_8to16table[256]; +static int shiftmask_fl=0; +static long r_shift,g_shift,b_shift; +static unsigned long r_mask,g_mask,b_mask; + +void shiftmask_init() +{ + unsigned int x; + r_mask=x_vis->red_mask; + g_mask=x_vis->green_mask; + b_mask=x_vis->blue_mask; + for(r_shift=-8,x=1;x<r_mask;x=x<<1)r_shift++; + for(g_shift=-8,x=1;x<g_mask;x=x<<1)g_shift++; + for(b_shift=-8,x=1;x<b_mask;x=x<<1)b_shift++; + shiftmask_fl=1; +} + +PIXEL xlib_rgb(int r,int g,int b) +{ + PIXEL p; + if(shiftmask_fl==0) shiftmask_init(); + p=0; + + if(r_shift>0) { + p=(r<<(r_shift))&r_mask; + } else if(r_shift<0) { + p=(r>>(-r_shift))&r_mask; + } else p|=(r&r_mask); + + if(g_shift>0) { + p|=(g<<(g_shift))&g_mask; + } else if(g_shift<0) { + p|=(g>>(-g_shift))&g_mask; + } else p|=(g&g_mask); + + if(b_shift>0) { + p|=(b<<(b_shift))&b_mask; + } else if(b_shift<0) { + p|=(b>>(-b_shift))&b_mask; + } else p|=(b&b_mask); + + return p; +} + +void st2_fixup( XImage *framebuf, int x, int y, int width, int height) +{ + int xi,yi; + unsigned char *src; + PIXEL *dest; + + if( (x<0)||(y<0) )return; + + for (yi = y; yi < (y+height); yi++) { + src = &framebuf->data [yi * framebuf->bytes_per_line]; + dest = (PIXEL*)src; + for(xi = (x+width-1); xi >= x; xi--) { + dest[xi] = st2d_8to16table[src[xi]]; + } + } +} + + +// ======================================================================== +// Tragic death handler +// ======================================================================== + +void TragicDeath(int signal_num) +{ + XAutoRepeatOn(x_disp); + XCloseDisplay(x_disp); + Sys_Error("This death brought to you by the number %d\n", signal_num); +} + +// ======================================================================== +// makes a null cursor +// ======================================================================== + +static Cursor CreateNullCursor(Display *display, Window root) +{ + Pixmap cursormask; + XGCValues xgc; + GC gc; + XColor dummycolour; + Cursor cursor; + + cursormask = XCreatePixmap(display, root, 1, 1, 1/*depth*/); + xgc.function = GXclear; + gc = XCreateGC(display, cursormask, GCFunction, &xgc); + XFillRectangle(display, cursormask, gc, 0, 0, 1, 1); + dummycolour.pixel = 0; + dummycolour.red = 0; + dummycolour.flags = 04; + cursor = XCreatePixmapCursor(display, cursormask, cursormask, + &dummycolour,&dummycolour, 0,0); + XFreePixmap(display,cursormask); + XFreeGC(display,gc); + return cursor; +} + +void ResetFrameBuffer(void) +{ + int mem; + int pwidth; + + if (x_framebuffer[0]) + { + free(x_framebuffer[0]->data); + free(x_framebuffer[0]); + } + + if (d_pzbuffer) + { + D_FlushCaches (); + Hunk_FreeToHighMark (X11_highhunkmark); + d_pzbuffer = NULL; + } + X11_highhunkmark = Hunk_HighMark (); + +// alloc an extra line in case we want to wrap, and allocate the z-buffer + X11_buffersize = vid.width * vid.height * sizeof (*d_pzbuffer); + + vid_surfcachesize = D_SurfaceCacheForRes (vid.width, vid.height); + + X11_buffersize += vid_surfcachesize; + + d_pzbuffer = Hunk_HighAllocName (X11_buffersize, "video"); + if (d_pzbuffer == NULL) + Sys_Error ("Not enough memory for video mode\n"); + + vid_surfcache = (byte *) d_pzbuffer + + vid.width * vid.height * sizeof (*d_pzbuffer); + + D_InitCaches(vid_surfcache, vid_surfcachesize); + + pwidth = x_visinfo->depth / 8; + if (pwidth == 3) pwidth = 4; + mem = ((vid.width*pwidth+7)&~7) * vid.height; + + x_framebuffer[0] = XCreateImage( x_disp, + x_vis, + x_visinfo->depth, + ZPixmap, + 0, + malloc(mem), + vid.width, vid.height, + 32, + 0); + + if (!x_framebuffer[0]) + Sys_Error("VID: XCreateImage failed\n"); + + vid.buffer = (byte*) (x_framebuffer[0]); + vid.conbuffer = vid.buffer; + +} + +void ResetSharedFrameBuffers(void) +{ + + int size; + int key; + int minsize = getpagesize(); + int frm; + + if (d_pzbuffer) + { + D_FlushCaches (); + Hunk_FreeToHighMark (X11_highhunkmark); + d_pzbuffer = NULL; + } + + X11_highhunkmark = Hunk_HighMark (); + +// alloc an extra line in case we want to wrap, and allocate the z-buffer + X11_buffersize = vid.width * vid.height * sizeof (*d_pzbuffer); + + vid_surfcachesize = D_SurfaceCacheForRes (vid.width, vid.height); + + X11_buffersize += vid_surfcachesize; + + d_pzbuffer = Hunk_HighAllocName (X11_buffersize, "video"); + if (d_pzbuffer == NULL) + Sys_Error ("Not enough memory for video mode\n"); + + vid_surfcache = (byte *) d_pzbuffer + + vid.width * vid.height * sizeof (*d_pzbuffer); + + D_InitCaches(vid_surfcache, vid_surfcachesize); + + for (frm=0 ; frm<2 ; frm++) + { + + // free up old frame buffer memory + + if (x_framebuffer[frm]) + { + XShmDetach(x_disp, &x_shminfo[frm]); + free(x_framebuffer[frm]); + shmdt(x_shminfo[frm].shmaddr); + } + + // create the image + + x_framebuffer[frm] = XShmCreateImage( x_disp, + x_vis, + x_visinfo->depth, + ZPixmap, + 0, + &x_shminfo[frm], + vid.width, + vid.height ); + + // grab shared memory + + size = x_framebuffer[frm]->bytes_per_line + * x_framebuffer[frm]->height; + if (size < minsize) + Sys_Error("VID: Window must use at least %d bytes\n", minsize); + + key = random(); + x_shminfo[frm].shmid = shmget((key_t)key, size, IPC_CREAT|0777); + if (x_shminfo[frm].shmid==-1) + Sys_Error("VID: Could not get any shared memory\n"); + + // attach to the shared memory segment + x_shminfo[frm].shmaddr = + (void *) shmat(x_shminfo[frm].shmid, 0, 0); + + printf("VID: shared memory id=%d, addr=0x%lx\n", x_shminfo[frm].shmid, + (long) x_shminfo[frm].shmaddr); + + x_framebuffer[frm]->data = x_shminfo[frm].shmaddr; + + // get the X server to attach to it + + if (!XShmAttach(x_disp, &x_shminfo[frm])) + Sys_Error("VID: XShmAttach() failed\n"); + XSync(x_disp, 0); + shmctl(x_shminfo[frm].shmid, IPC_RMID, 0); + + } + +} + +// Called at startup to set up translation tables, takes 256 8 bit RGB values +// the palette data will go away after the call, so it must be copied off if +// the video driver will need it again + +void VID_Init (unsigned char *palette) +{ + + int pnum, i; + XVisualInfo template; + int num_visuals; + int template_mask; + + S_Init(); + + ignorenext=0; + vid.width = 320; + vid.height = 200; + vid.maxwarpwidth = WARP_WIDTH; + vid.maxwarpheight = WARP_HEIGHT; + vid.numpages = 2; + vid.colormap = host_colormap; + // vid.cbits = VID_CBITS; + // vid.grades = VID_GRADES; + vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048)); + + srandom(getpid()); + + verbose=COM_CheckParm("-verbose"); + +// open the display + x_disp = XOpenDisplay(0); + if (!x_disp) + { + if (getenv("DISPLAY")) + Sys_Error("VID: Could not open display [%s]\n", + getenv("DISPLAY")); + else + Sys_Error("VID: Could not open local display\n"); + } + +// catch signals so i can turn on auto-repeat + + { + struct sigaction sa; + sigaction(SIGINT, 0, &sa); + sa.sa_handler = TragicDeath; + sigaction(SIGINT, &sa, 0); + sigaction(SIGTERM, &sa, 0); + } + + XAutoRepeatOff(x_disp); + +// for debugging only + XSynchronize(x_disp, True); + +// check for command-line window size + if ((pnum=COM_CheckParm("-winsize"))) + { + if (pnum >= com_argc-2) + Sys_Error("VID: -winsize <width> <height>\n"); + vid.width = Q_atoi(com_argv[pnum+1]); + vid.height = Q_atoi(com_argv[pnum+2]); + if (!vid.width || !vid.height) + Sys_Error("VID: Bad window width/height\n"); + } + if ((pnum=COM_CheckParm("-width"))) { + if (pnum >= com_argc-1) + Sys_Error("VID: -width <width>\n"); + vid.width = Q_atoi(com_argv[pnum+1]); + if (!vid.width) + Sys_Error("VID: Bad window width\n"); + } + if ((pnum=COM_CheckParm("-height"))) { + if (pnum >= com_argc-1) + Sys_Error("VID: -height <height>\n"); + vid.height = Q_atoi(com_argv[pnum+1]); + if (!vid.height) + Sys_Error("VID: Bad window height\n"); + } + + template_mask = 0; + +// specify a visual id + if ((pnum=COM_CheckParm("-visualid"))) + { + if (pnum >= com_argc-1) + Sys_Error("VID: -visualid <id#>\n"); + template.visualid = Q_atoi(com_argv[pnum+1]); + template_mask = VisualIDMask; + } + +// If not specified, use default visual + else + { + int screen; + screen = XDefaultScreen(x_disp); + template.visualid = + XVisualIDFromVisual(XDefaultVisual(x_disp, screen)); + template_mask = VisualIDMask; + } + +// pick a visual- warn if more than one was available + x_visinfo = XGetVisualInfo(x_disp, template_mask, &template, &num_visuals); + if (num_visuals > 1) + { + printf("Found more than one visual id at depth %d:\n", template.depth); + for (i=0 ; i<num_visuals ; i++) + printf(" -visualid %d\n", (int)(x_visinfo[i].visualid)); + } + else if (num_visuals == 0) + { + if (template_mask == VisualIDMask) + Sys_Error("VID: Bad visual id %d\n", template.visualid); + else + Sys_Error("VID: No visuals at depth %d\n", template.depth); + } + + if (verbose) + { + printf("Using visualid %d:\n", (int)(x_visinfo->visualid)); + printf(" screen %d\n", x_visinfo->screen); + printf(" red_mask 0x%x\n", (int)(x_visinfo->red_mask)); + printf(" green_mask 0x%x\n", (int)(x_visinfo->green_mask)); + printf(" blue_mask 0x%x\n", (int)(x_visinfo->blue_mask)); + printf(" colormap_size %d\n", x_visinfo->colormap_size); + printf(" bits_per_rgb %d\n", x_visinfo->bits_per_rgb); + } + + x_vis = x_visinfo->visual; + +// setup attributes for main window + { + int attribmask = CWEventMask | CWColormap | CWBorderPixel; + XSetWindowAttributes attribs; + Colormap tmpcmap; + + tmpcmap = XCreateColormap(x_disp, XRootWindow(x_disp, + x_visinfo->screen), x_vis, AllocNone); + + attribs.event_mask = StructureNotifyMask | KeyPressMask + | KeyReleaseMask | ExposureMask | PointerMotionMask | + ButtonPressMask | ButtonReleaseMask; + attribs.border_pixel = 0; + attribs.colormap = tmpcmap; + +// create the main window + x_win = XCreateWindow( x_disp, + XRootWindow(x_disp, x_visinfo->screen), + 0, 0, // x, y + vid.width, vid.height, + 0, // borderwidth + x_visinfo->depth, + InputOutput, + x_vis, + attribmask, + &attribs ); + XStoreName( x_disp,x_win,"xquake"); + + + if (x_visinfo->class != TrueColor) + XFreeColormap(x_disp, tmpcmap); + + } + + if (x_visinfo->depth == 8) + { + + // create and upload the palette + if (x_visinfo->class == PseudoColor) + { + x_cmap = XCreateColormap(x_disp, x_win, x_vis, AllocAll); + VID_SetPalette(palette); + XSetWindowColormap(x_disp, x_win, x_cmap); + } + + } + +// inviso cursor + XDefineCursor(x_disp, x_win, CreateNullCursor(x_disp, x_win)); + +// create the GC + { + XGCValues xgcvalues; + int valuemask = GCGraphicsExposures; + xgcvalues.graphics_exposures = False; + x_gc = XCreateGC(x_disp, x_win, valuemask, &xgcvalues ); + } + +// map the window + XMapWindow(x_disp, x_win); + +// wait for first exposure event + { + XEvent event; + do + { + XNextEvent(x_disp, &event); + if (event.type == Expose && !event.xexpose.count) + oktodraw = true; + } while (!oktodraw); + } +// now safe to draw + +// even if MITSHM is available, make sure it's a local connection + if (XShmQueryExtension(x_disp)) + { + char *displayname; + doShm = true; + displayname = (char *) getenv("DISPLAY"); + if (displayname) + { + char *d = displayname; + while (*d && (*d != ':')) d++; + if (*d) *d = 0; + if (!(!strcasecmp(displayname, "unix") || !*displayname)) + doShm = false; + } + } + + if (doShm) + { + x_shmeventtype = XShmGetEventBase(x_disp) + ShmCompletion; + ResetSharedFrameBuffers(); + } + else + ResetFrameBuffer(); + + current_framebuffer = 0; + vid.rowbytes = x_framebuffer[0]->bytes_per_line; + vid.buffer = x_framebuffer[0]->data; + vid.direct = 0; + vid.conbuffer = x_framebuffer[0]->data; + vid.conrowbytes = vid.rowbytes; + vid.conwidth = vid.width; + vid.conheight = vid.height; + vid.aspect = ((float)vid.height / (float)vid.width) * (320.0 / 240.0); + +// XSynchronize(x_disp, False); + +} + +void VID_ShiftPalette(unsigned char *p) +{ + VID_SetPalette(p); +} + + + +void VID_SetPalette(unsigned char *palette) +{ + + int i; + XColor colors[256]; + + for(i=0;i<256;i++) + st2d_8to16table[i]= xlib_rgb(palette[i*3], + palette[i*3+1],palette[i*3+2]); + + if (x_visinfo->class == PseudoColor && x_visinfo->depth == 8) + { + if (palette != current_palette) + memcpy(current_palette, palette, 768); + for (i=0 ; i<256 ; i++) + { + colors[i].pixel = i; + colors[i].flags = DoRed|DoGreen|DoBlue; + colors[i].red = palette[i*3] * 257; + colors[i].green = palette[i*3+1] * 257; + colors[i].blue = palette[i*3+2] * 257; + } + XStoreColors(x_disp, x_cmap, colors, 256); + } + +} + +// Called at shutdown + +void VID_Shutdown (void) +{ + Con_Printf("VID_Shutdown\n"); + XAutoRepeatOn(x_disp); + XCloseDisplay(x_disp); +} + +int XLateKey(XKeyEvent *ev) +{ + + int key; + char buf[64]; + KeySym keysym; + + key = 0; + + XLookupString(ev, buf, sizeof buf, &keysym, 0); + + switch(keysym) + { + case XK_KP_Page_Up: + case XK_Page_Up: key = K_PGUP; break; + + case XK_KP_Page_Down: + case XK_Page_Down: key = K_PGDN; break; + + case XK_KP_Home: + case XK_Home: key = K_HOME; break; + + case XK_KP_End: + case XK_End: key = K_END; break; + + case XK_KP_Left: + case XK_Left: key = K_LEFTARROW; break; + + case XK_KP_Right: + case XK_Right: key = K_RIGHTARROW; break; + + case XK_KP_Down: + case XK_Down: key = K_DOWNARROW; break; + + case XK_KP_Up: + case XK_Up: key = K_UPARROW; break; + + case XK_Escape: key = K_ESCAPE; break; + + case XK_KP_Enter: + case XK_Return: key = K_ENTER; break; + + case XK_Tab: key = K_TAB; break; + + case XK_F1: key = K_F1; break; + + case XK_F2: key = K_F2; break; + + case XK_F3: key = K_F3; break; + + case XK_F4: key = K_F4; break; + + case XK_F5: key = K_F5; break; + + case XK_F6: key = K_F6; break; + + case XK_F7: key = K_F7; break; + + case XK_F8: key = K_F8; break; + + case XK_F9: key = K_F9; break; + + case XK_F10: key = K_F10; break; + + case XK_F11: key = K_F11; break; + + case XK_F12: key = K_F12; break; + + case XK_BackSpace: key = K_BACKSPACE; break; + + case XK_KP_Delete: + case XK_Delete: key = K_DEL; break; + + case XK_Pause: key = K_PAUSE; break; + + case XK_Shift_L: + case XK_Shift_R: key = K_SHIFT; break; + + case XK_Execute: + case XK_Control_L: + case XK_Control_R: key = K_CTRL; break; + + case XK_Alt_L: + case XK_Meta_L: + case XK_Alt_R: + case XK_Meta_R: key = K_ALT; break; + + case XK_KP_Begin: key = K_AUX30; break; + + case XK_Insert: + case XK_KP_Insert: key = K_INS; break; + + case XK_KP_Multiply: key = '*'; break; + case XK_KP_Add: key = '+'; break; + case XK_KP_Subtract: key = '-'; break; + case XK_KP_Divide: key = '/'; break; + +#if 0 + case 0x021: key = '1';break;/* [!] */ + case 0x040: key = '2';break;/* [@] */ + case 0x023: key = '3';break;/* [#] */ + case 0x024: key = '4';break;/* [$] */ + case 0x025: key = '5';break;/* [%] */ + case 0x05e: key = '6';break;/* [^] */ + case 0x026: key = '7';break;/* [&] */ + case 0x02a: key = '8';break;/* [*] */ + case 0x028: key = '9';;break;/* [(] */ + case 0x029: key = '0';break;/* [)] */ + case 0x05f: key = '-';break;/* [_] */ + case 0x02b: key = '=';break;/* [+] */ + case 0x07c: key = '\'';break;/* [|] */ + case 0x07d: key = '[';break;/* [}] */ + case 0x07b: key = ']';break;/* [{] */ + case 0x022: key = '\'';break;/* ["] */ + case 0x03a: key = ';';break;/* [:] */ + case 0x03f: key = '/';break;/* [?] */ + case 0x03e: key = '.';break;/* [>] */ + case 0x03c: key = ',';break;/* [<] */ +#endif + + default: + key = *(unsigned char*)buf; + if (key >= 'A' && key <= 'Z') + key = key - 'A' + 'a'; +// fprintf(stdout, "case 0x0%x: key = ___;break;/* [%c] */\n", keysym); + break; + } + + return key; +} + +struct +{ + int key; + int down; +} keyq[64]; +int keyq_head=0; +int keyq_tail=0; + +int config_notify=0; +int config_notify_width; +int config_notify_height; + +void GetEvent(void) +{ + XEvent x_event; + int b; + + XNextEvent(x_disp, &x_event); + switch(x_event.type) { + case KeyPress: + keyq[keyq_head].key = XLateKey(&x_event.xkey); + keyq[keyq_head].down = true; + keyq_head = (keyq_head + 1) & 63; + break; + case KeyRelease: + keyq[keyq_head].key = XLateKey(&x_event.xkey); + keyq[keyq_head].down = false; + keyq_head = (keyq_head + 1) & 63; + break; + + case MotionNotify: + if (_windowed_mouse.value) { + mouse_x = (float) ((int)x_event.xmotion.x - (int)(vid.width/2)); + mouse_y = (float) ((int)x_event.xmotion.y - (int)(vid.height/2)); +//printf("m: x=%d,y=%d, mx=%3.2f,my=%3.2f\n", +// x_event.xmotion.x, x_event.xmotion.y, mouse_x, mouse_y); + + /* move the mouse to the window center again */ + XSelectInput(x_disp,x_win,StructureNotifyMask|KeyPressMask + |KeyReleaseMask|ExposureMask + |ButtonPressMask + |ButtonReleaseMask); + XWarpPointer(x_disp,None,x_win,0,0,0,0, + (vid.width/2),(vid.height/2)); + XSelectInput(x_disp,x_win,StructureNotifyMask|KeyPressMask + |KeyReleaseMask|ExposureMask + |PointerMotionMask|ButtonPressMask + |ButtonReleaseMask); + } else { + mouse_x = (float) (x_event.xmotion.x-p_mouse_x); + mouse_y = (float) (x_event.xmotion.y-p_mouse_y); + p_mouse_x=x_event.xmotion.x; + p_mouse_y=x_event.xmotion.y; + } + break; + + case ButtonPress: + b=-1; + if (x_event.xbutton.button == 1) + b = 0; + else if (x_event.xbutton.button == 2) + b = 2; + else if (x_event.xbutton.button == 3) + b = 1; + if (b>=0) + mouse_buttonstate |= 1<<b; + break; + + case ButtonRelease: + b=-1; + if (x_event.xbutton.button == 1) + b = 0; + else if (x_event.xbutton.button == 2) + b = 2; + else if (x_event.xbutton.button == 3) + b = 1; + if (b>=0) + mouse_buttonstate &= ~(1<<b); + break; + + case ConfigureNotify: +//printf("config notify\n"); + config_notify_width = x_event.xconfigure.width; + config_notify_height = x_event.xconfigure.height; + config_notify = 1; + break; + + default: + if (doShm && x_event.type == x_shmeventtype) + oktodraw = true; + } + + if (old_windowed_mouse != _windowed_mouse.value) { + old_windowed_mouse = _windowed_mouse.value; + + if (!_windowed_mouse.value) { + /* ungrab the pointer */ + XUngrabPointer(x_disp,CurrentTime); + } else { + /* grab the pointer */ + XGrabPointer(x_disp,x_win,True,0,GrabModeAsync, + GrabModeAsync,x_win,None,CurrentTime); + } + } +} + +// flushes the given rectangles from the view buffer to the screen + +void VID_Update (vrect_t *rects) +{ + +// if the window changes dimension, skip this frame + + if (config_notify) + { + fprintf(stderr, "config notify\n"); + config_notify = 0; + vid.width = config_notify_width & ~7; + vid.height = config_notify_height; + if (doShm) + ResetSharedFrameBuffers(); + else + ResetFrameBuffer(); + vid.rowbytes = x_framebuffer[0]->bytes_per_line; + vid.buffer = x_framebuffer[current_framebuffer]->data; + vid.conbuffer = vid.buffer; + vid.conwidth = vid.width; + vid.conheight = vid.height; + vid.conrowbytes = vid.rowbytes; + vid.recalc_refdef = 1; // force a surface cache flush + Con_CheckResize(); + Con_Clear_f(); + return; + } + + if (doShm) + { + + while (rects) + { + if (x_visinfo->depth != 8) + st2_fixup( x_framebuffer[current_framebuffer], + rects->x, rects->y, rects->width, + rects->height); + if (!XShmPutImage(x_disp, x_win, x_gc, + x_framebuffer[current_framebuffer], rects->x, rects->y, + rects->x, rects->y, rects->width, rects->height, True)) + Sys_Error("VID_Update: XShmPutImage failed\n"); + oktodraw = false; + while (!oktodraw) GetEvent(); + rects = rects->pnext; + } + current_framebuffer = !current_framebuffer; + vid.buffer = x_framebuffer[current_framebuffer]->data; + vid.conbuffer = vid.buffer; + XSync(x_disp, False); + } + else + { + while (rects) + { + if (x_visinfo->depth != 8) + st2_fixup( x_framebuffer[current_framebuffer], + rects->x, rects->y, rects->width, + rects->height); + XPutImage(x_disp, x_win, x_gc, x_framebuffer[0], rects->x, + rects->y, rects->x, rects->y, rects->width, rects->height); + rects = rects->pnext; + } + XSync(x_disp, False); + } + +} + +static int dither; + +void VID_DitherOn(void) +{ + if (dither == 0) + { + vid.recalc_refdef = 1; + dither = 1; + } +} + +void VID_DitherOff(void) +{ + if (dither) + { + vid.recalc_refdef = 1; + dither = 0; + } +} + +int Sys_OpenWindow(void) +{ + return 0; +} + +void Sys_EraseWindow(int window) +{ +} + +void Sys_DrawCircle(int window, int x, int y, int r) +{ +} + +void Sys_DisplayWindow(int window) +{ +} + +void Sys_SendKeyEvents(void) +{ +// get events from x server + if (x_disp) + { + while (XPending(x_disp)) GetEvent(); + while (keyq_head != keyq_tail) + { + Key_Event(keyq[keyq_tail].key, keyq[keyq_tail].down); + keyq_tail = (keyq_tail + 1) & 63; + } + } +} + +#if 0 +char *Sys_ConsoleInput (void) +{ + + static char text[256]; + int len; + fd_set readfds; + int ready; + struct timeval timeout; + + timeout.tv_sec = 0; + timeout.tv_usec = 0; + FD_ZERO(&readfds); + FD_SET(0, &readfds); + ready = select(1, &readfds, 0, 0, &timeout); + + if (ready>0) + { + len = read (0, text, sizeof(text)); + if (len >= 1) + { + text[len-1] = 0; // rip off the /n and terminate + return text; + } + } + + return 0; + +} +#endif + +void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height) +{ +// direct drawing of the "accessing disk" icon isn't supported under Linux +} + +void D_EndDirectRect (int x, int y, int width, int height) +{ +// direct drawing of the "accessing disk" icon isn't supported under Linux +} + +void IN_Init (void) +{ + Cvar_RegisterVariable (&_windowed_mouse); + Cvar_RegisterVariable (&m_filter); + if ( COM_CheckParm ("-nomouse") ) + return; + mouse_x = mouse_y = 0.0; + mouse_avail = 1; +} + +void IN_Shutdown (void) +{ + mouse_avail = 0; +} + +void IN_Commands (void) +{ + int i; + + if (!mouse_avail) return; + + for (i=0 ; i<mouse_buttons ; i++) { + if ( (mouse_buttonstate & (1<<i)) && !(mouse_oldbuttonstate & (1<<i)) ) + Key_Event (K_MOUSE1 + i, true); + + if ( !(mouse_buttonstate & (1<<i)) && (mouse_oldbuttonstate & (1<<i)) ) + Key_Event (K_MOUSE1 + i, false); + } + mouse_oldbuttonstate = mouse_buttonstate; +} + +void IN_Move (usercmd_t *cmd) +{ + if (!mouse_avail) + return; + + if (m_filter.value) { + mouse_x = (mouse_x + old_mouse_x) * 0.5; + mouse_y = (mouse_y + old_mouse_y) * 0.5; + } + + old_mouse_x = mouse_x; + old_mouse_y = mouse_y; + + mouse_x *= sensitivity.value; + mouse_y *= sensitivity.value; + + if ( (in_strafe.state & 1) || (lookstrafe.value && (in_mlook.state & 1) )) + cmd->sidemove += m_side.value * mouse_x; + else + cl.viewangles[YAW] -= m_yaw.value * mouse_x; + if (in_mlook.state & 1) + V_StopPitchDrift (); + + if ( (in_mlook.state & 1) && !(in_strafe.state & 1)) { + cl.viewangles[PITCH] += m_pitch.value * mouse_y; + if (cl.viewangles[PITCH] > 80) + cl.viewangles[PITCH] = 80; + if (cl.viewangles[PITCH] < -70) + cl.viewangles[PITCH] = -70; + } else { + if ((in_strafe.state & 1) && noclip_anglehack) + cmd->upmove -= m_forward.value * mouse_y; + else + cmd->forwardmove -= m_forward.value * mouse_y; + } + mouse_x = mouse_y = 0.0; +} + +void VID_LockBuffer (void) +{ +} + +void VID_UnlockBuffer (void) +{ +} + |
