# Mesa 3-D graphics library
# Version:  5.1
#
# Copyright (C) 1999-2003  Brian Paul   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
# BRIAN PAUL 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.

# Win32/FX core makefile for Mesa
#
#  Copyright (c) 2003 - Hiroshi Morii
#  Email : koolsmoky@users.sourceforge.net
#  URL   : http://www.3dfxzone.it/koolsmoky

# Debug build                : nmake -f Makefile.fx.win32 DEBUG=1
# Optimized build            : nmake -f Makefile.fx.win32
# Remove objects             : nmake -f Makefile.fx.win32 clean
# Remove files in bin, lib   : nmake -f Makefile.fx.win32 clobber
# Remove all generated files : nmake -f Makefile.fx.win32 realclean

.SUFFIXES: .S
##################################
# general
##################################
BUILDROOT = ..\..

!if "$(GLIDE3SDK)"==""
GLIDE3SDK = $(BUILDROOT)\glide3
!endif

!if "$(GLIDE3SDK)"==""
!error GLIDE3SDK undefined! Need to specify Glide3x SDK path!
!endif

GLIDE3LIB = $(GLIDE3SDK)\lib\glide3x.lib
TEXUS2LIB = #$(GLIDE3SDK)\lib\texus2.lib
LIBDIR    = $(BUILDROOT)\lib
GL_DLL    = OpenGL32.dll

HAVE_X86   = 1
HAVE_MMX   = 1
HAVE_SSE   =
HAVE_3DNOW = 1

##################################
# build flags
##################################
FLAGS = -DH3 -DFX -DBUILD_GL32

!if "$(USE_IEEE)"=="1"
FLAGS = $(FLAGS) -D__i386__
!endif

!if "$(HAVE_MMX)"=="1"
FLAGS = $(FLAGS) -DUSE_MMX_ASM
!endif
!if "$(HAVE_SSE)"=="1"
FLAGS = $(FLAGS) -DUSE_SSE_ASM
!endif
!if "$(HAVE_3DNOW)"=="1"
FLAGS = $(FLAGS) -DUSE_3DNOW_ASM
!endif
!if "$(HAVE_X86)"=="1"
FLAGS = $(FLAGS) -DUSE_X86_ASM
!endif

!if "$(DEBUG)" == "1"
FLAGS = $(FLAGS) -DMESA_DEBUG -DFX_DEBUG
!endif

##################################
# compiler setup
##################################
CC   = cl
LINK = link
AR   = lib
AS   = nasm

CFLAGS  = -nologo -Zm300 -G6 -W3 -c -D_MSC_VER=1200 -D__MSC__ -D_WIN32 -DWIN32 -DSTRICT
LFLAGS  = -nologo /DLL /OPT:WIN98 /MACHINE:IX86 /NODEFAULTLIB
ARFLAGS = -nologo
ASFLAGS = -O2 -fwin32

!if "$(DEBUG)"== "1"
CFLAGS  = $(CFLAGS) -Od -MTd -Zi -DDEBUG=1 -D_DEBUG -D_MT
LFLAGS  = $(LFLAGS) -debugtype:both /DEBUG
ARFLAGS = $(ARFLAGS) -debugtype:both
ASFLAGS = $(ASFLAGS) -g -DDEBUG=1
!else
CFLAGS  = $(CFLAGS) -Ox -MT -D_MT
LFLAGS  = $(LFLAGS) -RELEASE
!endif

#################################
# OS commands
#################################
RM = @del
MV = mv

#################################
# sources
#################################
MAIN_SOURCES =\
	main\api_arrayelt.c\
	main\api_loopback.c\
	main\api_noop.c\
	main\api_validate.c\
	main\accum.c\
	main\arbparse.c\
	main\arbprogram.c\
	main\arbfragparse.c\
	main\arbvertparse.c\
	main\attrib.c\
	main\blend.c\
	main\bufferobj.c\
	main\buffers.c\
	main\clip.c\
	main\colortab.c\
	main\context.c\
	main\convolve.c\
	main\debug.c\
	main\depth.c\
	main\dispatch.c\
	main\dlist.c\
	main\drawpix.c\
	main\enable.c\
	main\enums.c\
	main\eval.c\
	main\extensions.c\
	main\feedback.c\
	main\fog.c\
	main\get.c\
	main\hash.c\
	main\hint.c\
	main\histogram.c\
	main\image.c\
	main\imports.c\
	main\light.c\
	main\lines.c\
	main\matrix.c\
	main\nvprogram.c\
	main\nvfragparse.c\
	main\nvvertexec.c\
	main\nvvertparse.c\
	main\occlude.c\
	main\pixel.c\
	main\points.c\
	main\polygon.c\
	main\program.c\
	main\rastpos.c\
	main\state.c\
	main\stencil.c\
	main\texcompress.c\
	main\texformat.c\
	main\teximage.c\
	main\texobj.c\
	main\texstate.c\
	main\texstore.c\
	main\texutil.c\
	main\varray.c\
	main\vtxfmt.c

GLAPI_SOURCES =\
	glapi\glapi.c\
	glapi\glthread.c

MATH_SOURCES =\
	math\m_debug_clip.c\
	math\m_debug_norm.c\
	math\m_debug_xform.c\
	math\m_eval.c\
	math\m_matrix.c\
	math\m_translate.c\
	math\m_vector.c\
	math\m_xform.c

ARRAY_CACHE_SOURCES =\
	array_cache\ac_context.c\
	array_cache\ac_import.c

SWRAST_SOURCES =\
	swrast\s_aaline.c\
	swrast\s_aatriangle.c\
	swrast\s_accum.c\
	swrast\s_alpha.c\
	swrast\s_alphabuf.c\
	swrast\s_bitmap.c\
	swrast\s_blend.c\
	swrast\s_buffers.c\
	swrast\s_copypix.c\
	swrast\s_context.c\
	swrast\s_depth.c\
	swrast\s_drawpix.c\
	swrast\s_feedback.c\
	swrast\s_fog.c\
	swrast\s_imaging.c\
	swrast\s_lines.c\
	swrast\s_logic.c\
	swrast\s_masking.c\
	swrast\s_nvfragprog.c\
	swrast\s_pixeltex.c\
	swrast\s_points.c\
	swrast\s_readpix.c\
	swrast\s_span.c\
	swrast\s_stencil.c\
	swrast\s_texture.c\
	swrast\s_texstore.c\
	swrast\s_triangle.c\
	swrast\s_zoom.c

SWRAST_SETUP_SOURCES =\
	swrast_setup\ss_context.c\
	swrast_setup\ss_triangle.c\
	swrast_setup\ss_vb.c

TNL_SOURCES =\
	tnl\t_array_api.c\
	tnl\t_array_import.c\
	tnl\t_context.c\
	tnl\t_eval_api.c\
	tnl\t_imm_alloc.c\
	tnl\t_imm_api.c\
	tnl\t_imm_debug.c\
	tnl\t_imm_dlist.c\
	tnl\t_imm_elt.c\
	tnl\t_imm_eval.c\
	tnl\t_imm_exec.c\
	tnl\t_imm_fixup.c\
	tnl\t_pipeline.c\
	tnl\t_vb_fog.c\
	tnl\t_vb_light.c\
	tnl\t_vb_normals.c\
	tnl\t_vb_points.c\
	tnl\t_vb_program.c\
	tnl\t_vb_render.c\
	tnl\t_vb_texgen.c\
	tnl\t_vb_texmat.c\
	tnl\t_vb_vertex.c

DRIVER_SOURCES =\
	drivers\glide\fxapi.c\
	drivers\glide\fxdd.c\
	drivers\glide\fxddspan.c\
	drivers\glide\fxddtex.c\
	drivers\glide\fxsetup.c\
	drivers\glide\fxtexman.c\
	drivers\glide\fxtris.c\
	drivers\glide\fxvb.c\
	drivers\glide\fxglidew.c\
	drivers\glide\fxwgl.c\
	drivers\glide\fxg.c

X86_SOURCES =\
	x86\x86.c\
	x86\glapi_x86.S\
	x86\common_x86.c\
	x86\common_x86_asm.S\
	x86\x86_xform2.S\
	x86\x86_xform3.S\
	x86\x86_xform4.S\
	x86\x86_cliptest.S

MMX_SOURCES =\
	x86\mmx_blend.S

SSE_SOURCES =\
	x86\sse.c\
	x86\sse_xform2.S\
	x86\sse_xform3.S\
	x86\sse_xform4.S\
	x86\sse_normal.S

K3D_SOURCES =\
	x86\3dnow.c\
	x86\3dnow_xform2.S\
	x86\3dnow_xform3.S\
	x86\3dnow_xform4.S\
	x86\3dnow_normal.S

!if "$(HAVE_MMX)"=="1"
X86_SOURCES = $(X86_SOURCES) $(MMX_SOURCES)
HAVE_X86 = 1
!endif
!if "$(HAVE_SSE)"=="1"
X86_SOURCES = $(X86_SOURCES) $(SSE_SOURCES)
HAVE_X86 = 1
!endif
!if "$(HAVE_3DNOW)"=="1"
X86_SOURCES = $(X86_SOURCES) $(K3D_SOURCES)
HAVE_X86 = 1
!endif
!if "$(HAVE_X86)"=="1"
!else
X86_SOURCES =
!endif

EXPORTS = drivers\glide\fxopengl.def

MAIN_OBJS         = $(MAIN_SOURCES:.c=.obj)
GLAPI_OBJS        = $(GLAPI_SOURCES:.c=.obj)
MATH_OBJS         = $(MATH_SOURCES:.c=.obj)
ARRAY_CACHE_OBJS  = $(ARRAY_CACHE_SOURCES:.c=.obj)
SWRAST_OBJS       = $(SWRAST_SOURCES:.c=.obj)
SWRAST_SETUP_OBJS = $(SWRAST_SETUP_SOURCES:.c=.obj)
TNL_OBJS          = $(TNL_SOURCES:.c=.obj)
DRIVER_OBJS       = $(DRIVER_SOURCES:.c=.obj)
X86_OBJS          = $(X86_SOURCES:.c=.obj)
X86_OBJS          = $(X86_OBJS:.S=.obj)

RES = drivers\glide\fx.res

CORE_LIBS =\
	$(LIBDIR)\main.lib\
	$(LIBDIR)\glapi.lib\
	$(LIBDIR)\math.lib\
	$(LIBDIR)\array_cache.lib\
	$(LIBDIR)\swrast.lib\
	$(LIBDIR)\swarst_setup.lib\
	$(LIBDIR)\tnl.lib

!if "$(X86_SOURCES)"!=""
X86_LIB = $(LIBDIR)\x86.lib
!else
X86_LIB =
!endif

INCS  = -I$(BUILDROOT)\include\
        -I.\
        -I.\drivers\glide\
        -I.\main\
        -I.\glapi\
        -I$(GLIDE3SDK)\include

DEP_LIB = user32.lib gdi32.lib kernel32.lib

!if "$(DEBUG)" == "1"
STD_LIB = MSVCRTD.lib
!else
STD_LIB = MSVCRT.lib
!endif

#################################
# build rules
#################################
default:: all

all: $(X86_LIB) $(CORE_LIBS) $(LIBDIR)\$(GL_DLL)

$(LIBDIR)\$(GL_DLL): $(DRIVER_OBJS) $(CORE_LIBS) $(X86_LIB) $(RES)
	$(LINK) -out:$@ -def:$(EXPORTS) $(LFLAGS) $(DRIVER_OBJS) $(CORE_LIBS) $(X86_LIB) $(DEP_LIB) $(STD_LIB) $(TEXUS2LIB) $(GLIDE3LIB) $(RES)

$(LIBDIR)\main.lib: $(MAIN_OBJS)
	$(AR) -out:$@ $(ARFLAGS) $(MAIN_OBJS)

$(LIBDIR)\glapi.lib: $(GLAPI_OBJS)
	$(AR) -out:$@ $(ARFLAGS) $(GLAPI_OBJS)

$(LIBDIR)\math.lib: $(MATH_OBJS)
	$(AR) -out:$@ $(ARFLAGS) $(MATH_OBJS)

$(LIBDIR)\array_cache.lib: $(ARRAY_CACHE_OBJS)
	$(AR) -out:$@ $(ARFLAGS) $(ARRAY_CACHE_OBJS)

$(LIBDIR)\swrast.lib: $(SWRAST_OBJS)
	$(AR) -out:$@ $(ARFLAGS) $(SWRAST_OBJS)

$(LIBDIR)\swarst_setup.lib: $(SWRAST_SETUP_OBJS)
	$(AR) -out:$@ $(ARFLAGS) $(SWRAST_SETUP_OBJS)

$(LIBDIR)\tnl.lib: $(TNL_OBJS)
	$(AR) -out:$@ $(ARFLAGS) $(TNL_OBJS)

x86\matypes.h: x86\gen_matypes.exe
	x86\gen_matypes.exe > $@

x86\gen_matypes.exe: x86\gen_matypes.obj
	$(LINK) -out:$@ -nologo x86\gen_matypes.obj

$(LIBDIR)\x86.lib: x86\matypes.h $(X86_OBJS)
	$(AR) -out:$@ $(ARFLAGS) $(X86_OBJS)

.c.obj:
	$(CC) $(CFLAGS) $(FLAGS) $(INCS) $< /Fo$*.obj

.S.obj:
	$(CC) $(CFLAGS) $(FLAGS) $(INCS) $< -D__WIN32__ -DNASM_ASSEMBLER -EP > $*.i
	$(AS) $(ASFLAGS) $(INCS) $*.i -o $*.obj
	$(RM) $*.i

.rc.res:
	$(RC) -Fo$@ $(INCS) $(FLAGS) -D__WIN32__ $<

# [dBorca] Hack alert:
# glapi_x86.S needs some adjustments
# in order to generate correct entrypoints
x86\glapi_x86.obj: x86\glapi_x86.S
	$(CC) $(CFLAGS) $(FLAGS) $(INCS) x86\glapi_x86.S -DSTDCALL_API -DNASM_ASSEMBLER -EP > $*.i
	$(AS) $(ASFLAGS) $(INCS) $*.i -o $*.obj
	$(RM) $*.i

#################################
# cleanup rules
#################################
realclean: clean clobber

clean::
	$(RM) array_cache\*.obj
	$(RM) glapi\*.obj
	$(RM) main\*.obj
	$(RM) math\*.obj
	$(RM) swrast\*.obj
	$(RM) swrast_setup\*.obj
	$(RM) tnl\*.obj
	$(RM) x86\*.obj
	$(RM) drivers\glide\*.obj
        $(RM) drivers\glide\*.res
        $(RM) $(LIBDIR)\*.pdb
        $(RM) *.pdb

clobber::
	$(RM) $(LIBDIR)\*.lib
	$(RM) $(LIBDIR)\*.exp
	$(RM) $(LIBDIR)\*.dll