# Linux makefile for Glide2/CVG
# This makefile MUST be processed by GNU make!!!
#
#  Copyright (c) 2004 - Daniel Borca
#  Email : dborca@users.sourceforge.net
#  Web   : http://www.geocities.com/dborca
#
#  Copyright (c) 2004 - Hiroshi Morii
#  Email : koolsmoky@users.sourceforge.net
#  Web   : http://www.3dfxzone.it/koolsmoky
#
#  Copyright (c) 2006 - Guillem Jover <guillem@hadrons.org>
#


#
#  Available options:
#
#    Environment variables:
#	FX_GLIDE_HW	build for the given ASIC (cvg).
#			default = cvg
#	CPU		optimize for the given processor.
#			default = 6 (PentiumPro)
#	DEBUG=1		disable optimizations and build for debug.
#			default = no
#	USE_X86=1	use assembler triangle specializations; req by CVG
#			default = yes
#	USE_3DNOW=1	allow 3DNow! specializations. However, the true CPU
#			capabilities are still checked at run-time to avoid
#			crashes.
#			default = no
#	USE_MMX=1	allow MMX specializations.
#			default = no
#	FXOEM2X=1	build fxoem2x.so
#			default = no
#
#    Targets:
#	all:		build everything
#	glide2x:	build Glide2x lib
#	clean:		remove object files
#	realclean:	remove all generated files
#



.PHONY: all glide2x clean realclean
.INTERMEDIATE: fxgasm
.SUFFIXES: .lo

export PATH := $(PATH):.

###############################################################################
#	general defines (user settable?)
###############################################################################

GLIDE_VERSION_MAJOR = 2
GLIDE_VERSION_MINOR = 53

GLIDE_LIB = libglide.a
GLIDE_SO  = libglide.so
GLIDE_SONAME = $(GLIDE_SO).$(GLIDE_VERSION_MAJOR)
GLIDE_SHARED = $(GLIDE_SONAME).$(GLIDE_VERSION_MINOR)

FX_GLIDE_HW ?= cvg
FX_GLIDE_SW = ../../../swlibs
GLIDE_LIBDIR = ../../lib

###############################################################################
#	tools
###############################################################################

CC = gcc
AS = nasm
AR = ar

CP = cp

###############################################################################
#	defines
###############################################################################

# platform
CDEFS = -DINIT_LINUX -D__3Dfx_PCI_CFG__
LDLIBS = -lm

# general
CDEFS += -DGLIDE_HW_TRI_SETUP=1 -DGLIDE_PACKED_RGB=1 -DGLIDE_TRI_CULLING=1 -DGLIDE_DEFAULT_GAMMA=1.3f -DGLIDE_LIB=1
#CDEFS += -DGLIDE3 -DGLIDE3_ALPHA -DGLIDE3_SCALER

# special sli buffer clears
CDEFS += -DGLIDE_BLIT_CLEAR=1

# workaround for CVGs with broken tsus which cannot send commands to multiple 
# tmus using chipfield. chipfield will always be set to 0xf
CDEFS += -DGLIDE_CHIP_BROADCAST=1

# subsystem
CDEFS += -DCVG

# debug
ifdef DEBUG
CDEFS += -DGDBG_INFO_ON -DGLIDE_DEBUG -DGLIDE_SANITY_ASSERT -DGLIDE_SANITY_SIZE
endif

override USE_FIFO = 1
#override USE_X86 = 1

ifeq ($(USE_X86),1)
CDEFS += -DGLIDE_DISPATCH_SETUP=1 -DGLIDE_DISPATCH_DOWNLOAD=1
override USE_FIFO = 1
else
CDEFS += -DGLIDE_USE_C_TRISETUP=1
endif

# fifo
ifeq ($(USE_FIFO),1)
CDEFS += -DUSE_PACKET_FIFO=1 -DGLIDE_PACKET3_TRI_SETUP=1
endif

# other
CDEFS += -DGLIDE_PLUG -DGLIDE_SPLASH

###############################################################################
#	flags
###############################################################################

# librarian
ARFLAGS = rus

# assembler
ASFLAGS = -O6 -felf -D__linux__
ASFLAGS += $(CDEFS)

# compiler
CFLAGS = -Wall -W
CFLAGS += -I. -I../../incsrc -I../../init
CFLAGS += -I$(FX_GLIDE_SW)/fxmisc -I$(FX_GLIDE_SW)/newpci/pcilib -I$(FX_GLIDE_SW)/fxmemmap
CFLAGS += $(CDEFS)

# cpu optimized triangle
ifeq ($(USE_MMX),1)
CFLAGS += -DGL_MMX
override USE_X86 = 1
endif

ifeq ($(USE_3DNOW),1)
CFLAGS += -DGL_AMD3D
override USE_X86 = 1
endif

ifeq ($(USE_X86),1)
CFLAGS += -DGL_X86
OPTFLAGS ?= -O2 -ffast-math
else
CFLAGS += -DGLIDE_USE_C_TRISETUP
OPTFLAGS ?= -O2 -ffast-math
endif

# optflags
CFLAGS += $(OPTFLAGS)

###############################################################################
#	objects
###############################################################################

GLIDE_OBJECTS = \
	fifo.o \
	gsplash.o \
	g3df.o  \
	gu.o \
	guclip.o \
	gpci.o \
	gump.o \
	diglide.o \
	disst.o \
	ditex.o \
	gbanner.o \
	gerror.o \
	gmovie.o \
	digutex.o \
	ddgump.o \
	gaa.o \
	gdraw.o \
	gglide.o \
	glfb.o \
	gsst.o \
	gtex.o \
	gtexdl.o \
	gutex.o \
	cpuid.o \
	fpu.o \
	xtexdl_def.o

ifeq ($(USE_X86),1)
GLIDE_OBJECTS += \
	xdraw2_def.o
ifeq ($(USE_MMX),1)
GLIDE_OBJECTS += \
	xtexdl_mmx.o
endif
ifeq ($(USE_3DNOW),1)
GLIDE_OBJECTS += \
	xdraw2_3dnow.o \
	xtexdl_3dnow.o
endif
else
GLIDE_OBJECTS += \
	gxdraw.o
endif

GLIDE_OBJECTS += \
	$(FX_GLIDE_SW)/newpci/pcilib/fxpci.o \
	$(FX_GLIDE_SW)/newpci/pcilib/fxlinux.o \
	$(FX_GLIDE_SW)/newpci/pcilib/fxmsr.o \
	../../init/canopus.o \
	../../init/dac.o \
	../../init/gamma.o \
	../../init/gdebug.o \
	../../init/info.o \
	../../init/parse.o \
	../../init/print.o \
	../../init/sli.o \
	../../init/sst1init.o \
	../../init/util.o \
	../../init/video.o

# FIXME: needed for now to match the old library signature, should be checked
#        if it's really needed.
GLIDE_OBJECTS += \
	$(FX_GLIDE_SW)/fxmisc/fxos.o \
	$(FX_GLIDE_SW)/fxmisc/fximg.o

###############################################################################
#	rules
###############################################################################

.c.o:
	$(CC) -o $@ $(CFLAGS) -c $<
.c.lo:
	$(CC) -o $@ $(CFLAGS) -DPIC -fPIC -c $<

###############################################################################
#	main
###############################################################################
all: glide2x fxoem2x

glide2x: $(GLIDE_LIBDIR)/$(GLIDE_LIB) $(GLIDE_LIBDIR)/$(GLIDE_SO)

$(GLIDE_LIBDIR)/$(GLIDE_LIB): $(GLIDE_OBJECTS)
	$(AR) $(ARFLAGS) $@ $^

$(GLIDE_LIBDIR)/$(GLIDE_SO): $(GLIDE_LIBDIR)/$(GLIDE_SHARED)
	ln -fs $(GLIDE_SHARED) $(GLIDE_LIBDIR)/$(GLIDE_SO)

$(GLIDE_LIBDIR)/$(GLIDE_SHARED): $(GLIDE_OBJECTS:.o=.lo)
	$(CC) -o $@ -shared -Wl,-soname,$(GLIDE_SONAME) $^ $(LDFLAGS) $(LDLIBS)

ifeq ($(FXOEM2X),1)
$(GLIDE_LIBDIR)/libfxoem2x.so: ../oem/oeminit.o
#	$(LD) -o $@ $(LDFLAGS) ../oem/oeminit.o $(LDLIBS)
else
$(GLIDE_LIBDIR)/libfxoem2x.so:
#	$(warning FxOem2x not enabled... Skipping libfxoem2x.so)
endif

fxoem2x: $(GLIDE_LIBDIR)/libfxoem2x.so

###############################################################################
#	rules(2)
###############################################################################

#cpuid.o: cpudtect.asm
#	$(AS) -o $@ $(ASFLAGS) $<
xdraw2_def.o: xdraw2.asm
	$(AS) -o $@ $(ASFLAGS) $<
xtexdl_def.o: xtexdl.c
	$(CC) -o $@ $(CFLAGS) -c $<
xtexdl_mmx.o: xtexdl.asm
	$(AS) -o $@ $(ASFLAGS) -DGL_MMX=1 $<
xdraw2_3dnow.o: xdraw2.asm
	$(AS) -o $@ $(ASFLAGS) -DGL_AMD3D=1 $<
xtexdl_3dnow.o: xtexdl.asm
	$(AS) -o $@ $(ASFLAGS) -DGL_AMD3D=1 $<

#cpuid.lo: cpuid.o
#	$(CP) $< $@
xdraw2_def.lo: xdraw2_def.o
	$(CP) $< $@
xtexdl_def.lo: xtexdl_def.o
	$(CP) $< $@
xtexdl_mmx.lo: xtexdl_mmx.o
	$(CP) $< $@
xdraw2_3dnow.lo: xdraw2_3dnow.o
	$(CP) $< $@
xtexdl_3dnow.lo: xtexdl_3dnow.o
	$(CP) $< $@

$(GLIDE_OBJECTS): fxinline.h fxgasm.h

fxinline.h: fxgasm
	./$< -inline > $@

fxgasm.h: fxgasm
	./$< -hex > $@

fxgasm: fxgasm.c
	$(CC) -o $@ $(CFLAGS) $<

###############################################################################
#	clean, realclean
###############################################################################

clean:
	-$(RM) *.o *.lo
	-$(RM) ../../init/*.o ../../init/*.lo
	-$(RM) $(FX_GLIDE_SW)/newpci/pcilib/*.o $(FX_GLIDE_SW)/newpci/pcilib/*.lo
	-$(RM) fxinline.h
	-$(RM) fxgasm.h

realclean: clean
	-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_LIB)
	-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_SHARED)
	-$(RM) $(GLIDE_LIBDIR)/$(GLIDE_SO)
