Compare commits
55 Commits
mesa-24.1.
...
vtx-0-2-24
Author | SHA1 | Date | |
---|---|---|---|
|
027fdb8bbd | ||
|
3a7c3b02a3 | ||
|
3ec97611d2 | ||
|
f2f09abce4 | ||
|
93320957f2 | ||
|
374a09c4f7 | ||
|
1302fd3b25 | ||
|
5198950cde | ||
|
88d66b7208 | ||
|
701208d259 | ||
|
dfd3c9c40f | ||
|
cef9471ab2 | ||
|
8d8bb0679c | ||
|
5affcd3cbb | ||
|
86ac3e3c2d | ||
|
5c2d467e6d | ||
|
c00a1c4622 | ||
|
dad38213e7 | ||
|
9cbad64314 | ||
|
f0bf8c0ed1 | ||
|
6b692dc06c | ||
|
be3c25458b | ||
|
a384b0c5eb | ||
|
acfa4d46a4 | ||
|
df3b1eb5bc | ||
|
34a9e4adaf | ||
|
34f6df8b6d | ||
|
5fc6940aca | ||
|
c9c27a6efd | ||
|
79a49e30a1 | ||
|
f1582dbe52 | ||
|
4fc77f884c | ||
|
398f8d10a2 | ||
|
5b9ad341a0 | ||
|
fcd68a2b30 | ||
|
f1bbe8d0a5 | ||
|
3c0cfda46b | ||
|
5d80efc35e | ||
|
e01f56b3a8 | ||
|
30cd200068 | ||
|
e55c545d4a | ||
|
b101554d16 | ||
|
1b8c209523 | ||
|
d46adad5cd | ||
|
bfc37379cc | ||
|
0c390fec04 | ||
|
d5c9fd383b | ||
|
8ae69294ad | ||
|
46330d3aa7 | ||
|
c91f7ad52b | ||
|
5b40d6924c | ||
|
27b4c2d675 | ||
|
051a8141d1 | ||
|
9b6d6988c4 | ||
|
967fa00a7f |
28
Make-config
28
Make-config
@@ -33,6 +33,7 @@ VERSION=$(MESA_MAJOR).$(MESA_MINOR)
|
||||
# ASM_SOURCES optional list of assembly language files to assemble
|
||||
# MAKELIB the script or command to make a library file
|
||||
# XXX MAKELIB is obsolete; edit bin/mklib to support new systems
|
||||
# MKLIB_OPTIONS extra options to pass to the mklib script (like -arch)
|
||||
|
||||
|
||||
aix:
|
||||
@@ -527,10 +528,10 @@ linux-glide:
|
||||
"CFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DFX -DPTHREADS -I/usr/X11R6/include -I/usr/include/glide -I/usr/local/glide/include" \
|
||||
"CXXFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_SVID_SOURCE -D_BSD_SOURCE" \
|
||||
"GLUT_CFLAGS = -fexceptions" \
|
||||
"GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lm -lpthread -L/usr/local/glide/lib -lglide2x" \
|
||||
"GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lm -lpthread -L/usr/local/glide/lib -lglide3x" \
|
||||
"GLU_LIB_DEPS = -L$(TOP)/lib -lGL -lm" \
|
||||
"GLUT_LIB_DEPS = -L$(TOP)/lib -lGLU -lGL -L/usr/X11R6/lib -lX11 -lXmu -lXt -lXi -lm" \
|
||||
"APP_LIB_DEPS = -L/usr/local/glide/lib -lglide2x -lglut -lGLU -lGL"
|
||||
"APP_LIB_DEPS = -L/usr/local/glide/lib -lglide3x -lglut -lGLU -lGL"
|
||||
|
||||
linux-x86-glide:
|
||||
$(MAKE) $(MFLAGS) -f Makefile.X11 targets \
|
||||
@@ -544,7 +545,7 @@ linux-x86-glide:
|
||||
"CFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -funroll-loops -fomit-frame-pointer -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_X86_ASM -DUSE_MMX_ASM -DUSE_3DNOW_ASM -DUSE_SSE_ASM -DUSE_XSHM -DFX -DPTHREADS -I/usr/X11R6/include -I/usr/include/glide -I/usr/local/glide/include -I/usr/src/mesa-glx/src/FX/X86" \
|
||||
"CXXFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -funroll-loops -fomit-frame-pointer -D_SVID_SOURCE -D_BSD_SOURCE" \
|
||||
"GLUT_CFLAGS = -fexceptions" \
|
||||
"GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lm -L/usr/local/glide/lib -lglide2x -lm -lpthread" \
|
||||
"GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lm -L/usr/local/glide/lib -lglide3x -lm -lpthread" \
|
||||
"GLU_LIB_DEPS = -L$(TOP)/lib -lGL -lm" \
|
||||
"GLUT_LIB_DEPS = -L$(TOP)/lib -lGLU -lGL -L/usr/X11R6/lib -lX11 -lXmu -lXt -lXi -lm" \
|
||||
"GLW_LIB_DEPS = -L$(TOP)/lib -lGL -L/usr/X11R6/lib -lXt -lX11" \
|
||||
@@ -678,12 +679,24 @@ linux-osmesa16:
|
||||
"OSMESA16_LIB = libOSMesa16.so" \
|
||||
"CC = gcc" \
|
||||
"CXX = g++" \
|
||||
"CFLAGS = -O3 -ansi -pedantic -Wall -Wmissing-prototypes -Wundef -fPIC -ffast-math -D_SVID_SOURCE -D_BSD_SOURCE -I/usr/X11R6/include -DUSE_XSHM -DPTHREADS -DCHAN_BITS=16 -DDEFAULT_SOFTWARE_DEPTH_BITS=31" \
|
||||
"CXXFLAGS = -O3 -ansi -pedantic -Wall -Wmissing-prototypes -Wundef -fPIC -ffast-math -D_SVID_SOURCE -D_BSD_SOURCE" \
|
||||
"CFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DPTHREADS -I/usr/X11R6/include -DCHAN_BITS=16 -DDEFAULT_SOFTWARE_DEPTH_BITS=31" \
|
||||
"CXXFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE" \
|
||||
"GLUT_CFLAGS = -fexceptions" \
|
||||
"GL_LIB_DEPS = -lm -lpthread" \
|
||||
"APP_LIB_DEPS = -lOSMesa16 -lGL"
|
||||
|
||||
linux-osmesa16-static:
|
||||
$(MAKE) $(MFLAGS) -f Makefile.OSMesa16 targets \
|
||||
"OSMESA16_LIB = libOSMesa16.a" \
|
||||
"CC = gcc" \
|
||||
"CXX = g++" \
|
||||
"CFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE -DUSE_XSHM -DPTHREADS -I/usr/X11R6/include -DCHAN_BITS=16 -DDEFAULT_SOFTWARE_DEPTH_BITS=31" \
|
||||
"CXXFLAGS = -O3 -ansi -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE" \
|
||||
"GLUT_CFLAGS = -fexceptions" \
|
||||
"GL_LIB_DEPS = -lm -lpthread" \
|
||||
"MAKELIB_FLAGS = -static" \
|
||||
"APP_LIB_DEPS = -lOSMesa16 -lGL"
|
||||
|
||||
# 32-bit/channel Mesa using OSMesa driver
|
||||
linux-osmesa32:
|
||||
$(MAKE) $(MFLAGS) -f Makefile.OSMesa16 targets \
|
||||
@@ -700,6 +713,7 @@ linux-osmesa32:
|
||||
# change -g to -O3 for non-debug
|
||||
linux-solo:
|
||||
$(MAKE) $(MFLAGS) -f Makefile.X11 targets \
|
||||
"SOLO = true" \
|
||||
"LIBMESA = mesa.a" \
|
||||
"GLU_LIB = libGLU.so" \
|
||||
"GLUT_LIB = libglut.so" \
|
||||
@@ -708,7 +722,7 @@ linux-solo:
|
||||
"CFLAGS = -g -std=c99 -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE" \
|
||||
"CXXFLAGS = -g -std=c99 -pedantic -fPIC -ffast-math -D_POSIX_SOURCE -D_POSIX_C_SOURCE=199309L -D_SVID_SOURCE -D_BSD_SOURCE" \
|
||||
"GLUT_CFLAGS = -fexceptions" \
|
||||
"GL_LIB_DEPS = -lm -lpthread" \
|
||||
"GL_LIB_DEPS = -lm -lpthread -lexpat" \
|
||||
"GLU_LIB_DEPS = -L$(TOP)/lib -lGL -lm -Wl,-rpath,$(TOP)/lib" \
|
||||
"GLUT_LIB_DEPS = -L$(TOP)/lib -lGLU -lGL -lm -Wl,-rpath,$(TOP)/lib" \
|
||||
"APP_LIB_DEPS = -L$(TOP)/lib -lglut -lGLU -lGL -lm -lpthread -Wl,-rpath,$(TOP)/lib"
|
||||
@@ -1078,5 +1092,5 @@ linux-glide-debug:
|
||||
"CFLAGS = -g -ansi -pedantic -Wall -Wmissing-prototypes -fPIC -ffast-math -D_SVID_SOURCE -D_BSD_SOURCE -I/usr/X11R6/include -DUSE_XSHM -DPTHREADS -DFX -DDEBUG -I/usr/local/glide/include -I/usr/include/glide" \
|
||||
"CXXFLAGS = -g -ansi -pedantic -Wall -Wmissing-prototypes -fPIC -ffast-math -D_SVID_SOURCE -D_BSD_SOURCE -DDEBUG" \
|
||||
"GLUT_CFLAGS = -fexceptions" \
|
||||
"APP_LIB_DEPS = -L/usr/local/glide/lib -lglide2x -L/usr/X11R6/lib -lX11 -lXext -lXmu -lXt -lXi -lvga -lm -lpthread"
|
||||
"APP_LIB_DEPS = -L/usr/local/glide/lib -lglide3x -L/usr/X11R6/lib -lX11 -lXext -lXmu -lXt -lXi -lvga -lm -lpthread"
|
||||
|
||||
|
359
Makefile.X11
359
Makefile.X11
@@ -1,4 +1,4 @@
|
||||
# $Id: Makefile.X11,v 1.90 2003/10/03 14:03:14 brianp Exp $
|
||||
# $Id: Makefile.X11,v 1.89.2.1 2003/11/24 12:01:39 keithw Exp $
|
||||
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 5.1
|
||||
@@ -33,69 +33,70 @@ SHELL = /bin/sh
|
||||
|
||||
default:
|
||||
@echo "Type one of the following:"
|
||||
@echo " make aix for IBM RS/6000 with AIX"
|
||||
@echo " make aix-sl for IBM RS/6000, make shared libs"
|
||||
@echo " make beos-r4 for BeOS R4"
|
||||
@echo " make cygnus for Win95/NT using Cygnus-Win32"
|
||||
@echo " make cygnus-linux for Win95/NT using Cygnus-Win32 under Linux"
|
||||
@echo " make darwin for Darwin - Mac OS X"
|
||||
@echo " make freebsd for FreeBSD systems with GCC"
|
||||
@echo " make freebsd-386 for FreeBSD systems with GCC, w/ Intel assembly"
|
||||
@echo " make gcc-sl for a generic system with GCC for shared libs"
|
||||
@echo " make hpux9 for HP systems with HPUX 9.x"
|
||||
@echo " make hpux9-sl for HP systems with HPUX 9.x, make shared libs"
|
||||
@echo " make hpux9-gcc for HP systems with HPUX 9.x using GCC"
|
||||
@echo " make hpux9-gcc-sl for HP systems with HPUX 9.x, GCC, make shared libs"
|
||||
@echo " make hpux10 for HP systems with HPUX 10.x and 11.x"
|
||||
@echo " make hpux10-sl for HP systems with HPUX 10.x and 11.x, shared libs"
|
||||
@echo " make hpux10-gcc for HP systems with HPUX 10.x w/ GCC"
|
||||
@echo " make hpux10-gcc-sl for HP systems with HPUX 10.x w/ GCC, shared libs"
|
||||
@echo " make irix6-o32 for SGI systems with IRIX 6.x, make o32-bit libs"
|
||||
@echo " make irix6-o32-dso for SGI systems with IRIX 6.x, make o32-bit DSOs"
|
||||
@echo " make irix6-n32 for SGI systems with IRIX 6.x, make n32-bit libs"
|
||||
@echo " make irix6-n32-dso for SGI systems with IRIX 6.x, make n32-bit DSOs"
|
||||
@echo " make irix6-gcc-n32-sl for SGI systems with IRIX 6.x, GCC, make n32 DSOs"
|
||||
@echo " make irix6-64 for SGI systems with IRIX 6.x, make 64-bit libs"
|
||||
@echo " make irix6-64-dso for SGI systems with IRIX 6.x, make 64-bit DSOs"
|
||||
@echo " make aix for IBM RS/6000 with AIX"
|
||||
@echo " make aix-sl for IBM RS/6000, make shared libs"
|
||||
@echo " make beos-r4 for BeOS R4"
|
||||
@echo " make cygnus for Win95/NT using Cygnus-Win32"
|
||||
@echo " make cygnus-linux for Win95/NT using Cygnus-Win32 under Linux"
|
||||
@echo " make darwin for Darwin - Mac OS X"
|
||||
@echo " make freebsd for FreeBSD systems with GCC"
|
||||
@echo " make freebsd-386 for FreeBSD systems with GCC, w/ Intel assembly"
|
||||
@echo " make gcc-sl for a generic system with GCC for shared libs"
|
||||
@echo " make hpux9 for HP systems with HPUX 9.x"
|
||||
@echo " make hpux9-sl for HP systems with HPUX 9.x, make shared libs"
|
||||
@echo " make hpux9-gcc for HP systems with HPUX 9.x using GCC"
|
||||
@echo " make hpux9-gcc-sl for HP systems with HPUX 9.x, GCC, make shared libs"
|
||||
@echo " make hpux10 for HP systems with HPUX 10.x and 11.x"
|
||||
@echo " make hpux10-sl for HP systems with HPUX 10.x and 11.x, shared libs"
|
||||
@echo " make hpux10-gcc for HP systems with HPUX 10.x w/ GCC"
|
||||
@echo " make hpux10-gcc-sl for HP systems with HPUX 10.x w/ GCC, shared libs"
|
||||
@echo " make irix6-o32 for SGI systems with IRIX 6.x, make o32-bit libs"
|
||||
@echo " make irix6-o32-dso for SGI systems with IRIX 6.x, make o32-bit DSOs"
|
||||
@echo " make irix6-n32 for SGI systems with IRIX 6.x, make n32-bit libs"
|
||||
@echo " make irix6-n32-dso for SGI systems with IRIX 6.x, make n32-bit DSOs"
|
||||
@echo " make irix6-gcc-n32-sl for SGI systems with IRIX 6.x, GCC, make n32 DSOs"
|
||||
@echo " make irix6-64 for SGI systems with IRIX 6.x, make 64-bit libs"
|
||||
@echo " make irix6-64-dso for SGI systems with IRIX 6.x, make 64-bit DSOs"
|
||||
|
||||
@echo " make linux for Linux"
|
||||
@echo " make linux-x86 for Linux with x86 optimizations"
|
||||
@echo " make linux-ggi for Linux with libggi driver"
|
||||
@echo " make linux-x86-ggi for Linux with libggi driver and x86 optimizations"
|
||||
@echo " make linux-glide for Linux with 3Dfx Glide driver"
|
||||
@echo " make linux-x86-glide for Linux with 3Dfx Glide driver and x86 opts"
|
||||
@echo " make linux-alpha for Linux with Alpha optimizations"
|
||||
@echo " make linux-alpha-static for Linux with Alpha opts, make static libs"
|
||||
@echo " make linux-ppc for Linux with PowerPC opts"
|
||||
@echo " make linux-ppc-static for Linux with PowerPC opts, make static libs"
|
||||
@echo " make linux-sparc for Linux with Sparc optimzations"
|
||||
@echo " make linux-sparc5 for Linux with Sparc5 optimizations"
|
||||
@echo " make linux-sparc-ultra for Linux with UltraSparc optimizations"
|
||||
@echo " make linux-osmesa16 for 16-bit/channel OSMesa"
|
||||
@echo " make linux-osmesa32 for 32-bit/channel OSMesa"
|
||||
@echo " make linux-solo for Linux standalone with dri drivers"
|
||||
@echo " make linux-icc for Linux with the Intel C/C++ compiler"
|
||||
@echo " make lynxos for LynxOS systems with GCC"
|
||||
@echo " make mklinux for Linux on Power Macintosh"
|
||||
@echo " make netbsd for NetBSD 1.0 systems with GCC"
|
||||
@echo " make openbsd for OpenBSD systems"
|
||||
@echo " make openstep for OpenStep/MacOSX Server systems"
|
||||
@echo " make osf1 for DEC Alpha systems with OSF/1"
|
||||
@echo " make qnx for QNX V4 systems with Watcom compiler"
|
||||
@echo " make solaris-x86 for PCs with Solaris"
|
||||
@echo " make solaris-x86-gcc for PCs with Solaris using GCC"
|
||||
@echo " make sunos4 for Suns with SunOS 4.x"
|
||||
@echo " make sunos4-sl for Suns with SunOS 4.x, make shared libs"
|
||||
@echo " make sunos4-gcc for Suns with SunOS 4.x and GCC"
|
||||
@echo " make sunos4-gcc-sl for Suns with SunOS 4.x, GCC, make shared libs"
|
||||
@echo " make sunos5 for Suns with SunOS 5.x"
|
||||
@echo " make sunos5-smp for Suns with SunOS 5.x, SMP optimization"
|
||||
@echo " make sunos5-gcc for Suns with SunOS 5.x and GCC"
|
||||
@echo " make ultrix-gcc for DEC systems with Ultrix and GCC"
|
||||
@echo " make unixware for PCs running UnixWare"
|
||||
@echo " make unixware-shared for PCs running UnixWare, shared libs"
|
||||
@echo " make clean remove .o files"
|
||||
@echo " make realclean remove .o, library and executable files"
|
||||
@echo " make linux for Linux"
|
||||
@echo " make linux-x86 for Linux with x86 optimizations"
|
||||
@echo " make linux-ggi for Linux with libggi driver"
|
||||
@echo " make linux-x86-ggi for Linux with libggi driver and x86 optimizations"
|
||||
@echo " make linux-glide for Linux with 3Dfx Glide driver"
|
||||
@echo " make linux-x86-glide for Linux with 3Dfx Glide driver and x86 opts"
|
||||
@echo " make linux-alpha for Linux with Alpha optimizations"
|
||||
@echo " make linux-alpha-static for Linux with Alpha opts, make static libs"
|
||||
@echo " make linux-ppc for Linux with PowerPC opts"
|
||||
@echo " make linux-ppc-static for Linux with PowerPC opts, make static libs"
|
||||
@echo " make linux-sparc for Linux with Sparc optimzations"
|
||||
@echo " make linux-sparc5 for Linux with Sparc5 optimizations"
|
||||
@echo " make linux-sparc-ultra for Linux with UltraSparc optimizations"
|
||||
@echo " make linux-osmesa16 for 16-bit/channel OSMesa"
|
||||
@echo " make linux-osmesa16-static for 16-bit/channel OSMesa, make static libs"
|
||||
@echo " make linux-osmesa32 for 32-bit/channel OSMesa"
|
||||
@echo " make linux-solo for Linux standalone with dri drivers"
|
||||
@echo " make linux-icc for Linux with the Intel C/C++ compiler"
|
||||
@echo " make lynxos for LynxOS systems with GCC"
|
||||
@echo " make mklinux for Linux on Power Macintosh"
|
||||
@echo " make netbsd for NetBSD 1.0 systems with GCC"
|
||||
@echo " make openbsd for OpenBSD systems"
|
||||
@echo " make openstep for OpenStep/MacOSX Server systems"
|
||||
@echo " make osf1 for DEC Alpha systems with OSF/1"
|
||||
@echo " make qnx for QNX V4 systems with Watcom compiler"
|
||||
@echo " make solaris-x86 for PCs with Solaris"
|
||||
@echo " make solaris-x86-gcc for PCs with Solaris using GCC"
|
||||
@echo " make sunos4 for Suns with SunOS 4.x"
|
||||
@echo " make sunos4-sl for Suns with SunOS 4.x, make shared libs"
|
||||
@echo " make sunos4-gcc for Suns with SunOS 4.x and GCC"
|
||||
@echo " make sunos4-gcc-sl for Suns with SunOS 4.x, GCC, make shared libs"
|
||||
@echo " make sunos5 for Suns with SunOS 5.x"
|
||||
@echo " make sunos5-smp for Suns with SunOS 5.x, SMP optimization"
|
||||
@echo " make sunos5-gcc for Suns with SunOS 5.x and GCC"
|
||||
@echo " make ultrix-gcc for DEC systems with Ultrix and GCC"
|
||||
@echo " make unixware for PCs running UnixWare"
|
||||
@echo " make unixware-shared for PCs running UnixWare, shared libs"
|
||||
@echo " make clean remove .o files"
|
||||
@echo " make realclean remove .o, library and executable files"
|
||||
|
||||
|
||||
|
||||
@@ -224,10 +225,10 @@ linux-ggi-install linux-x86-ggi-install:
|
||||
# echo ".include $(DESTDIR)/etc/ggi/ggimesa.conf" >> $(DESTDIR)/etc/ggi/libggi.conf ; \
|
||||
# fi
|
||||
|
||||
linux-osmesa16 linux-osmesa32:
|
||||
linux-osmesa16 linux-osmesa16-static linux-osmesa32:
|
||||
-mkdir lib
|
||||
if [ -d src ] ; then touch src/depend ; fi
|
||||
if [ -d src ] ; then cd src ; $(MAKE) -f Makefile.OSMesa16 $@ ; fi
|
||||
if [ -d src/mesa ] ; then touch src/mesa/depend ; fi
|
||||
if [ -d src/mesa ] ; then cd src/mesa ; $(MAKE) -f Makefile.OSMesa16 $@ ; fi
|
||||
|
||||
linux-solo:
|
||||
-mkdir lib
|
||||
@@ -347,6 +348,10 @@ GLUT_NAME = GLUT-3.7
|
||||
LIB_FILES = \
|
||||
$(DIRECTORY)/Makefile* \
|
||||
$(DIRECTORY)/Make-config \
|
||||
$(DIRECTORY)/descrip.mms \
|
||||
$(DIRECTORY)/mms-config. \
|
||||
$(DIRECTORY)/Mesa.dsw \
|
||||
$(DIRECTORY)/bin/mklib* \
|
||||
$(DIRECTORY)/docs/*.html \
|
||||
$(DIRECTORY)/docs/COPYING \
|
||||
$(DIRECTORY)/docs/INSTALL.GNU \
|
||||
@@ -354,14 +359,7 @@ LIB_FILES = \
|
||||
$(DIRECTORY)/docs/RELNOTES* \
|
||||
$(DIRECTORY)/docs/VERSIONS \
|
||||
$(DIRECTORY)/docs/*.spec \
|
||||
$(DIRECTORY)/bin/README \
|
||||
$(DIRECTORY)/bin/mklib* \
|
||||
$(DIRECTORY)/descrip.mms \
|
||||
$(DIRECTORY)/mms-config \
|
||||
$(DIRECTORY)/xlib.opt \
|
||||
$(DIRECTORY)/include/GL/internal/glcore.h \
|
||||
$(DIRECTORY)/include/GL/Makefile.in \
|
||||
$(DIRECTORY)/include/GL/Makefile.am \
|
||||
$(DIRECTORY)/include/GL/dmesa.h \
|
||||
$(DIRECTORY)/include/GL/amesa.h \
|
||||
$(DIRECTORY)/include/GL/fxmesa.h \
|
||||
@@ -384,135 +382,86 @@ LIB_FILES = \
|
||||
$(DIRECTORY)/include/GL/xmesa.h \
|
||||
$(DIRECTORY)/include/GL/xmesa_x.h \
|
||||
$(DIRECTORY)/include/GL/xmesa_xf86.h \
|
||||
$(DIRECTORY)/include/GLView.h \
|
||||
$(DIRECTORY)/include/Makefile.in \
|
||||
$(DIRECTORY)/include/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/Makefile* \
|
||||
$(DIRECTORY)/src/mesa/descrip.mms \
|
||||
$(DIRECTORY)/src/mesa/mesa.conf \
|
||||
$(DIRECTORY)/src/mesa/*.def \
|
||||
$(DIRECTORY)/src/mesa/depend \
|
||||
$(DIRECTORY)/src/mesa/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/array_cache/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/array_cache/Makefile* \
|
||||
$(DIRECTORY)/src/mesa/math/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/math/Makefile* \
|
||||
$(DIRECTORY)/src/mesa/swrast/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/swrast/Makefile* \
|
||||
$(DIRECTORY)/src/mesa/swrast_setup/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/swrast_setup/Makefile* \
|
||||
$(DIRECTORY)/src/mesa/tnl/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/tnl/Makefile* \
|
||||
$(DIRECTORY)/src/mesa/tnl_dd/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/tnl_dd/imm/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/tnl_dd/imm/NOTES.imm \
|
||||
$(DIRECTORY)/src/mesa/drivers/windml/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/windml/tornado/*.c \
|
||||
$(DIRECTORY)/src/mesa/drivers/windml/tornado/*.cdf \
|
||||
$(DIRECTORY)/src/mesa/drivers/windml/man3/*.3 \
|
||||
$(DIRECTORY)/src/mesa/drivers/windml/man3/*.html \
|
||||
$(DIRECTORY)/src/mesa/drivers/dos/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dos/mga/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/beos/*.cpp \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/*.def \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/X86/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/X86/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/X86/*.[Shc] \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/ggimesa.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/default/*.c \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/default/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/default/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/default/genkgi.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/display/*.c \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/display/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/display/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/display/fbdev.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/ggi/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/ggi/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/ggi/mesa/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/ggi/mesa/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/ggi/mesa/*.h \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/Makefile.win \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/osmesa.def \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/sparc/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/sparc/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/sparc/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/svga/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/svga/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/svga/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/windows/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/windows/*.def \
|
||||
$(DIRECTORY)/src/mesa/drivers/x11/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/drivers/x11/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/x11/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/x86/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/x86/Makefile.am \
|
||||
$(DIRECTORY)/src/mesa/x86/Makefile.in \
|
||||
$(DIRECTORY)/src/mesa/x86/*.S \
|
||||
$(DIRECTORY)/src/glu/sgi/Makefile.am \
|
||||
$(DIRECTORY)/src/glu/sgi/Makefile.in \
|
||||
$(DIRECTORY)/src/glu/sgi/Makefile.X11 \
|
||||
$(DIRECTORY)/src/glu/sgi/Makefile.win \
|
||||
$(DIRECTORY)/src/glu/sgi/Makefile.DJ \
|
||||
$(DIRECTORY)/src/glu/sgi/glu.def \
|
||||
$(DIRECTORY)/src/glu/sgi/dummy.cc \
|
||||
$(DIRECTORY)/src/glu/sgi/descrip.mms \
|
||||
$(DIRECTORY)/src/glu/sgi/mesaglu.opt \
|
||||
$(DIRECTORY)/src/glu/sgi/include/gluos.h \
|
||||
$(DIRECTORY)/src/glu/sgi/include/Makefile.am \
|
||||
$(DIRECTORY)/src/glu/sgi/include/Makefile.in \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/Makefile.am \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/Makefile.in \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/interface/*.h \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/interface/*.cc \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/interface/Makefile.am \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/interface/Makefile.in \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/internals/*.h \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/internals/*.cc \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/internals/Makefile.am \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/internals/Makefile.in \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/nurbtess/*.h \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/nurbtess/*.cc \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/nurbtess/Makefile.am \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/nurbtess/Makefile.in \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/README \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/alg-outline \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/*.[ch] \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/libtess_la_SOURCES \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/Makefile.am \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/Makefile.in \
|
||||
$(DIRECTORY)/src/glu/sgi/libutil/*.[ch] \
|
||||
$(DIRECTORY)/src/glu/sgi/libutil/libutil_la_SOURCES \
|
||||
$(DIRECTORY)/src/glu/sgi/libutil/Makefile.am \
|
||||
$(DIRECTORY)/src/glu/sgi/libutil/Makefile.in \
|
||||
$(DIRECTORY)/src/glu/mesa/README[12] \
|
||||
$(DIRECTORY)/src/glu/mesa/Makefile* \
|
||||
$(DIRECTORY)/src/glu/mesa/descrip.mms \
|
||||
$(DIRECTORY)/src/glu/mesa/mms_depend \
|
||||
$(DIRECTORY)/src/glu/mesa/*.def \
|
||||
$(DIRECTORY)/src/glu/mesa/depend \
|
||||
$(DIRECTORY)/src/glu/mesa/*.[ch] \
|
||||
$(DIRECTORY)/src/glw/*.[ch] \
|
||||
$(DIRECTORY)/src/glw/Makefile* \
|
||||
$(DIRECTORY)/src/glw/README \
|
||||
$(DIRECTORY)/progs/util/README \
|
||||
$(DIRECTORY)/progs/util/Makefile.am \
|
||||
$(DIRECTORY)/progs/util/Makefile.in \
|
||||
$(DIRECTORY)/progs/util/*.[ch] \
|
||||
$(DIRECTORY)/progs/util/sampleMakefile \
|
||||
$(DIRECTORY)/vms/analyze_map.com \
|
||||
$(DIRECTORY)/vms/xlib.opt \
|
||||
$(DIRECTORY)/src/mesa/descrip.mms \
|
||||
$(DIRECTORY)/src/mesa/depend \
|
||||
$(DIRECTORY)/src/mesa/main/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/main/main.dsp \
|
||||
$(DIRECTORY)/src/mesa/glapi/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/glapi/glapi.dsp \
|
||||
$(DIRECTORY)/src/mesa/array_cache/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/array_cache/array_cache.dsp \
|
||||
$(DIRECTORY)/src/mesa/math/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/math/math.dsp \
|
||||
$(DIRECTORY)/src/mesa/swrast/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/swrast/swrast.dsp \
|
||||
$(DIRECTORY)/src/mesa/swrast_setup/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/swrast_setup/swrast_setup.dsp \
|
||||
$(DIRECTORY)/src/mesa/tnl/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/tnl/tnl.dsp \
|
||||
$(DIRECTORY)/src/mesa/tnl_dd/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/tnl_dd/imm/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/tnl_dd/imm/NOTES.imm \
|
||||
$(DIRECTORY)/src/mesa/drivers/common/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dos/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/drivers/dos/mga/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/beos/*.cpp \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/glide/*.def \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/ggimesa.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/default/*.c \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/default/genkgi.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/display/*.c \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/display/fbdev.conf.in \
|
||||
$(DIRECTORY)/src/mesa/drivers/ggi/include/ggi/mesa/*.h \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/Makefile.win \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/osmesa.def \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/osmesa.dsp \
|
||||
$(DIRECTORY)/src/mesa/drivers/osmesa/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/svga/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/windows/*/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/drivers/windows/*/*.def \
|
||||
$(DIRECTORY)/src/mesa/drivers/windows/*/*.dsp \
|
||||
$(DIRECTORY)/src/mesa/drivers/x11/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/sparc/*.[chS] \
|
||||
$(DIRECTORY)/src/mesa/x86/*.[ch] \
|
||||
$(DIRECTORY)/src/mesa/x86/*.S \
|
||||
$(DIRECTORY)/src/glu/sgi/Makefile.X11 \
|
||||
$(DIRECTORY)/src/glu/sgi/Makefile.win \
|
||||
$(DIRECTORY)/src/glu/sgi/Makefile.DJ \
|
||||
$(DIRECTORY)/src/glu/sgi/cc*.txt \
|
||||
$(DIRECTORY)/src/glu/sgi/glu.def \
|
||||
$(DIRECTORY)/src/glu/sgi/glu.dsp \
|
||||
$(DIRECTORY)/src/glu/sgi/dummy.cc \
|
||||
$(DIRECTORY)/src/glu/sgi/descrip.mms \
|
||||
$(DIRECTORY)/src/glu/sgi/mesaglu.opt \
|
||||
$(DIRECTORY)/src/glu/sgi/include/gluos.h \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/interface/*.h \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/interface/*.cc \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/internals/*.h \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/internals/*.cc \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/nurbtess/*.h \
|
||||
$(DIRECTORY)/src/glu/sgi/libnurbs/nurbtess/*.cc \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/README \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/alg-outline \
|
||||
$(DIRECTORY)/src/glu/sgi/libtess/*.[ch] \
|
||||
$(DIRECTORY)/src/glu/sgi/libutil/*.[ch] \
|
||||
$(DIRECTORY)/src/glu/mesa/README[12] \
|
||||
$(DIRECTORY)/src/glu/mesa/Makefile* \
|
||||
$(DIRECTORY)/src/glu/mesa/descrip.mms \
|
||||
$(DIRECTORY)/src/glu/mesa/mms_depend \
|
||||
$(DIRECTORY)/src/glu/mesa/*.def \
|
||||
$(DIRECTORY)/src/glu/mesa/depend \
|
||||
$(DIRECTORY)/src/glu/mesa/*.[ch] \
|
||||
$(DIRECTORY)/src/glw/*.[ch] \
|
||||
$(DIRECTORY)/src/glw/Makefile* \
|
||||
$(DIRECTORY)/src/glw/README \
|
||||
$(DIRECTORY)/progs/util/README \
|
||||
$(DIRECTORY)/progs/util/*.[ch] \
|
||||
$(DIRECTORY)/progs/util/sampleMakefile \
|
||||
$(DIRECTORY)/vms/analyze_map.com \
|
||||
$(DIRECTORY)/vms/xlib.opt \
|
||||
$(DIRECTORY)/vms/xlib_share.opt
|
||||
|
||||
|
||||
@@ -524,10 +473,11 @@ DEMO_FILES = \
|
||||
$(DIRECTORY)/src/glut/glx/*def \
|
||||
$(DIRECTORY)/src/glut/glx/descrip.mms \
|
||||
$(DIRECTORY)/src/glut/glx/mms_depend \
|
||||
$(DIRECTORY)/src/glut/glx/glut.dsp \
|
||||
$(DIRECTORY)/src/glut/glx/*.[ch] \
|
||||
$(DIRECTORY)/src/glut/glx.dos/*.[ch] \
|
||||
$(DIRECTORY)/src/glut/glx.dos/Makefile.DJ \
|
||||
$(DIRECTORY)/src/glut/glx.dos/PC_HW/*.[chS] \
|
||||
$(DIRECTORY)/src/glut/dos/*.[ch] \
|
||||
$(DIRECTORY)/src/glut/dos/Makefile.DJ \
|
||||
$(DIRECTORY)/src/glut/dos/PC_HW/*.[chS] \
|
||||
$(DIRECTORY)/progs/images/* \
|
||||
$(DIRECTORY)/progs/demos/Makefile* \
|
||||
$(DIRECTORY)/progs/demos/descrip.mms \
|
||||
@@ -535,6 +485,7 @@ DEMO_FILES = \
|
||||
$(DIRECTORY)/progs/demos/*.cxx \
|
||||
$(DIRECTORY)/progs/demos/*.dat \
|
||||
$(DIRECTORY)/progs/demos/README \
|
||||
$(DIRECTORY)/progs/demos/Windows/* \
|
||||
$(DIRECTORY)/progs/xdemos/Makefile* \
|
||||
$(DIRECTORY)/progs/xdemos/descrip.mms \
|
||||
$(DIRECTORY)/progs/xdemos/*.[chf] \
|
||||
|
87
Makefile.wfx
Normal file
87
Makefile.wfx
Normal file
@@ -0,0 +1,87 @@
|
||||
# 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 makefile for Mesa
|
||||
#
|
||||
# Copyright (c) 2003 - Hiroshi Morii
|
||||
# Email : koolsmoky@users.sourceforge.net
|
||||
# URL : http://www.3dfxzone.it/koolsmoky
|
||||
|
||||
# Debug build : nmake -f Makefile.wfx debug
|
||||
# Optimized build : nmake -f Makefile.wfx
|
||||
# Remove objects : nmake -f Makefile.wfx clean
|
||||
# Remove files in bin, lib : nmake -f Makefile.wfx clobber
|
||||
# Remove all generated files : nmake -f Makefile.wfx realclean
|
||||
|
||||
# Build the libs
|
||||
SUBDIRS = src\mesa.dir
|
||||
DBGBUILD = $(SUBDIRS:.dir=.debug)
|
||||
CLEAN = $(SUBDIRS:.dir=.clean)
|
||||
CLOBBER = $(SUBDIRS:.dir=.clobber)
|
||||
REALCLEAN = $(SUBDIRS:.dir=.realclean)
|
||||
LIBDIR = lib
|
||||
|
||||
# default rule
|
||||
default : $(LIBDIR) $(SUBDIRS)
|
||||
|
||||
# debug build rules
|
||||
debug : $(LIBDIR) $(DBGBUILD)
|
||||
|
||||
# cleanup rules
|
||||
clean : $(CLEAN)
|
||||
clobber : $(CLOBBER)
|
||||
realclean : $(REALCLEAN)
|
||||
|
||||
# inference rules
|
||||
$(LIBDIR):
|
||||
@echo.
|
||||
@mkdir $(LIBDIR)
|
||||
|
||||
$(SUBDIRS):
|
||||
@echo.
|
||||
@cd $*
|
||||
@nmake -f Makefile.wfx
|
||||
@cd ..
|
||||
|
||||
$(DBGBUILD):
|
||||
@echo.
|
||||
@cd $*
|
||||
@nmake -f Makefile.wfx DEBUG=1
|
||||
@cd ..
|
||||
|
||||
$(CLEAN):
|
||||
@echo.
|
||||
@cd $*
|
||||
@nmake -f Makefile.wfx clean
|
||||
@cd ..
|
||||
|
||||
$(CLOBBER):
|
||||
@echo.
|
||||
@cd $*
|
||||
@nmake -f Makefile.wfx clobber
|
||||
@cd ..
|
||||
|
||||
$(REALCLEAN):
|
||||
@echo.
|
||||
@cd $*
|
||||
@nmake -f Makefile.wfx realclean
|
||||
@cd ..
|
60
bin/mklib
60
bin/mklib
@@ -110,29 +110,40 @@ case $ARCH in
|
||||
|
||||
'Linux')
|
||||
LIBNAME="lib${LIBNAME}" # prefix with "lib"
|
||||
OPTS="-Xlinker -Bsymbolic -shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
|
||||
VERSION="${MAJOR}.${MINOR}.${PATCH}"
|
||||
|
||||
echo "mklib: Making Linux shared library: " ${LIBNAME}.so.${VERSION}
|
||||
if [ $STATIC = 1 ] ; then
|
||||
echo "mklib: Making Linux static library: " ${LIBNAME}.a
|
||||
LINK="ar"
|
||||
OPTS="-ruv"
|
||||
# make lib
|
||||
${LINK} ${OPTS} ${LIBNAME}.a ${OBJECTS}
|
||||
# finish up
|
||||
FINAL_LIBS="${LIBNAME}.a"
|
||||
else
|
||||
OPTS="-Xlinker -Bsymbolic -shared -Wl,-soname,${LIBNAME}.so.${MAJOR}"
|
||||
VERSION="${MAJOR}.${MINOR}.${PATCH}"
|
||||
|
||||
if [ $CPLUSPLUS = 1 ] ; then
|
||||
LINK="g++"
|
||||
else
|
||||
LINK="gcc"
|
||||
fi
|
||||
echo "mklib: Making Linux shared library: " ${LIBNAME}.so.${VERSION}
|
||||
|
||||
# rm any old libs
|
||||
rm -f ${LIBNAME}.so.${VERSION}
|
||||
rm -f ${LIBNAME}.so.${MAJOR}
|
||||
rm -f ${LIBNAME}.so
|
||||
if [ $CPLUSPLUS = 1 ] ; then
|
||||
LINK="g++"
|
||||
else
|
||||
LINK="gcc"
|
||||
fi
|
||||
|
||||
# make lib
|
||||
${LINK} ${OPTS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
|
||||
# make usual symlinks
|
||||
ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
|
||||
ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
|
||||
# finish up
|
||||
FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
|
||||
# rm any old libs
|
||||
rm -f ${LIBNAME}.so.${VERSION}
|
||||
rm -f ${LIBNAME}.so.${MAJOR}
|
||||
rm -f ${LIBNAME}.so
|
||||
|
||||
# make lib
|
||||
${LINK} ${OPTS} -o ${LIBNAME}.so.${VERSION} ${OBJECTS} ${DEPS}
|
||||
# make usual symlinks
|
||||
ln -s ${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR}
|
||||
ln -s ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so
|
||||
# finish up
|
||||
FINAL_LIBS="${LIBNAME}.so.${VERSION} ${LIBNAME}.so.${MAJOR} ${LIBNAME}.so"
|
||||
fi
|
||||
;;
|
||||
|
||||
'SunOS')
|
||||
@@ -302,6 +313,13 @@ case $ARCH in
|
||||
FINAL_LIBS=${LIBNAME}
|
||||
;;
|
||||
|
||||
'MorphOS')
|
||||
LIBNAME="lib${LIBNAME}.a"
|
||||
echo "mklib: Making MorphOS library: " ${LIBNAME}
|
||||
ppc-morphos-ar rc ${LIBNAME} ${OBJECTS}
|
||||
FINAL_LIBS="${LIBNAME}"
|
||||
;;
|
||||
|
||||
'example')
|
||||
# If you're adding support for a new architecture, you can
|
||||
# start with this:
|
||||
@@ -317,7 +335,9 @@ case $ARCH in
|
||||
echo "mklib: WARNING: please update the bin/mklib script!"
|
||||
# XXX this is a total hack for Mesa - remove someday
|
||||
# fall-back to an old mklib.* script
|
||||
${MAKELIB} "lib${LIBNAME}.a" ${MAJOR} ${MINOR} ${PATCH} ${OBJECTS}
|
||||
LIBNAME="lib${LIBNAME}.a"
|
||||
${TOP}/${MAKELIB} "lib${LIBNAME}.a" ${MAJOR} ${MINOR} ${PATCH} ${OBJECTS}
|
||||
FINAL_LIBS="${LIBNAME}"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
@@ -3,6 +3,65 @@
|
||||
|
||||
|
||||
|
||||
Mesa-5.1 release notes:
|
||||
-----------------------
|
||||
|
||||
1) Glide2 support has been ceased; in order to keep Voodoo Graphics
|
||||
and Voodoo Rush compatibility, please visit the Glide SourceForge
|
||||
and help us to fix Glide3 for those cards.
|
||||
2) The current release is a WIP; among other things, the Linux build works
|
||||
only to some extent. Any help will be appreciated.
|
||||
3) Glide3 can be found at http://sourceforge.net/projects/glide/
|
||||
|
||||
|
||||
|
||||
Known supported HW/OS:
|
||||
----------------------
|
||||
|
||||
Voodoo^2, Voodoo Banshee, Voodoo3, Voodoo4, Voodoo5
|
||||
DOS (DJGPP), Windows9x/2k (MinGW/MSVC), Linux
|
||||
|
||||
|
||||
|
||||
How to compile:
|
||||
---------------
|
||||
|
||||
DJGPP/MinGW/MSVC:
|
||||
Place the Glide3 SDK in the top Mesa directory:
|
||||
$(MESA)/glide3/include/*.h
|
||||
$(MESA)/glide3/lib/
|
||||
Required headers:
|
||||
3dfx.h, g3ext.h, glide.h, glidesys.h, glideutl.h, sst1vid.h
|
||||
Required libraries:
|
||||
OS specific
|
||||
Type:
|
||||
make -f Makefile.DJ HAVE_MMX=1 HAVE_3DNOW=1 FX=1
|
||||
or
|
||||
make -f Makefile.mgw HAVE_MMX=1 HAVE_3DNOW=1 FX=1
|
||||
or
|
||||
nmake -f Makefile.wfx
|
||||
Look into the corresponding makefiles for further information.
|
||||
|
||||
Linux:
|
||||
Place the Glide3 SDK in /usr/local/glide
|
||||
Type:
|
||||
make linux-glide
|
||||
|
||||
|
||||
|
||||
Contact:
|
||||
--------
|
||||
|
||||
Daniel Borca <dborca@users.sourceforge.net>
|
||||
Hiroshi Morii <koolsmoky@users.sourceforge.net>
|
||||
|
||||
|
||||
|
||||
The info below this line is outdated. You have been warned...
|
||||
*************************************************************
|
||||
|
||||
|
||||
|
||||
Info for Mesa 4.1
|
||||
-----------------
|
||||
|
||||
|
@@ -209,11 +209,12 @@ v1.3 (mar-2003)
|
||||
* revamped GLUT
|
||||
* switched to DXE3
|
||||
|
||||
v1.4 (oct-2003)
|
||||
v1.4 (nov-2003)
|
||||
+ enabled GLUT fonts with DXE
|
||||
+ truly added multi-window support in GLUT (for Adrian Woodward)
|
||||
* accomodated makefiles with the new sourcetree
|
||||
* fixed some ALPHA issues
|
||||
* minor changes to PC_HW/timer interface
|
||||
x hacked and slashed the 3dfx driver (w/ help from Hiroshi Morii)
|
||||
|
||||
|
||||
|
@@ -75,6 +75,12 @@ Details and Notes
|
||||
- No assembly code is compiled or assembled. Again, this may need
|
||||
some work to turn it back on or use it again.
|
||||
|
||||
- To build "mangled" Mesa, add the preprocessor define USE_MGL_NAMESPACE
|
||||
to the project settings. You will also need to edit src/mesa.def to change
|
||||
all the gl* symbols to mgl*. Because this is easy to do with a global
|
||||
replace operation in a text editor, no additional mangled version of mesa.def
|
||||
is maintained or shipped.
|
||||
|
||||
If you have a Windows-related build problem or question, it is
|
||||
probably better to direct it to me (kschultz@users.sourceforge.net),
|
||||
rather than directly to the other Mesa developers. I will help you
|
||||
|
@@ -1164,10 +1164,17 @@ Mesa Version History
|
||||
- less memory used for display lists and vertex buffers
|
||||
- demo of per-pixel lighting with a fragment program (demos/fplight.c)
|
||||
- new version (18) of glext.h header
|
||||
- new spriteblast.c demo of GL_ARB_point_sprite
|
||||
Bug fixes:
|
||||
- really enable OpenGL 1.4 features in DOS driver.
|
||||
- fixed issues in glDrawPixels and glCopyPixels for very wide images
|
||||
- glPixelMapf/ui/usv()'s size parameter is GLsizei, not GLint
|
||||
- fixed some texgen bugs reported by Daniel Borca
|
||||
- fixed wglMakeCurrent(NULL, NULL) bug (#835861)
|
||||
- fixed glTexSubImage3D z-offset bug (Cedric Gautier)
|
||||
- fixed RGBA blend enable bug (Ville Syrjala)
|
||||
- glAccum is supposed to be a no-op in selection/feedback mode
|
||||
- fixed texgen bug #597589 (John Popplewell)
|
||||
Changes:
|
||||
- dropped API trace feature (src/Trace/)
|
||||
- documentation overhaul. merged with website content. more html.
|
||||
|
@@ -17,7 +17,7 @@ available. Here are the basic instructions for Unix systems:
|
||||
login</code>
|
||||
</li><li>Just hit return at the <code>CVS password:</code> prompt.
|
||||
</li><li>Then checkout mesa: <code>cvs -z3 -d:pserver:anonymous@cvs.mesa3d.sourceforge.net:/cvsroot/mesa3d
|
||||
co Mesa</code>
|
||||
co Mesa-newtree</code>
|
||||
</li></ol>
|
||||
|
||||
<p>To update your Mesa CVS source to the latest CVS source:
|
||||
|
@@ -7,6 +7,26 @@
|
||||
<H1>News</H1>
|
||||
|
||||
|
||||
<H2>November 12, 2003</H2>
|
||||
|
||||
<p>
|
||||
New Mesa 5.0.2 tarballs have been uploaded to SourceForge which fix a
|
||||
number of automake/libtool problems.
|
||||
</p>
|
||||
<p>
|
||||
The new MD5 checksums are:
|
||||
</p>
|
||||
<pre>
|
||||
a9dcf3ff9ad1b7d6ce73a0df7cff8b5b MesaLib-5.0.2.tar.gz
|
||||
7b4bf9261657c2fca03796d4955e6f50 MesaLib-5.0.2.tar.bz2
|
||||
79c141bddcbad557647535d02194f346 MesaLib-5.0.2.zip
|
||||
952d9dc823dd818981d1a648d7b2668a MesaDemos-5.0.2.tar.gz
|
||||
b81fafff90995025d2f25ea02b786642 MesaDemos-5.0.2.tar.bz2
|
||||
a21be975589e8a2d1871b6bb7874fffa MesaDemos-5.0.2.zip
|
||||
</pre>
|
||||
|
||||
|
||||
|
||||
<h2>September 5, 2003</h2>
|
||||
|
||||
<p>
|
||||
@@ -39,18 +59,6 @@ Mesa 5.0.2 has been released. This is a stable, bug-fix release.
|
||||
Changes:
|
||||
- build GLUT with -fexceptions so C++ apps propogate exceptions
|
||||
</pre>
|
||||
<p>
|
||||
MD5 checksums follow:
|
||||
</p>
|
||||
<pre>
|
||||
2deb4176e7a06a0477ae31cadd55444b MesaLib-5.0.2.tar.gz
|
||||
dc147598ebdff4312260a7f79b3c5c9c MesaLib-5.0.2.tar.bz2
|
||||
1eb0fa7079131efef574e3bda328b8c8 MesaLib-5.0.2.zip
|
||||
e0dc86e9417620e794968641403604d4 MesaDemos-5.0.2.tar.gz
|
||||
a71afaeddd0b567423f88085576850d3 MesaDemos-5.0.2.tar.bz2
|
||||
32fbf1925cf45f548468ddda96087828 MesaDemos-5.0.2.zip
|
||||
</pre>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -673,6 +681,6 @@ source code</a>.</p>
|
||||
|
||||
|
||||
<hr>
|
||||
$Id: news.html,v 3.7 2003/09/05 13:39:39 brianp Exp $
|
||||
$Id: news.html,v 3.7.2.1 2003/11/24 12:01:42 keithw Exp $
|
||||
</body>
|
||||
</html>
|
@@ -22,7 +22,7 @@
|
||||
/*
|
||||
* FXMesa - 3Dfx Glide driver for Mesa. Contributed by David Bucciarelli
|
||||
*
|
||||
* NOTE: This version requires Glide 2.3 or later.
|
||||
* NOTE: This version requires Glide3 (http://sourceforge.net/projects/glide)
|
||||
*/
|
||||
|
||||
|
||||
|
@@ -2261,6 +2261,16 @@ typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC)(GLuint id, GLenum pname,
|
||||
#endif /* GL_ARB_occlusion_query */
|
||||
|
||||
|
||||
/* XXX temporary until glext.h is updated! */
|
||||
#ifndef GL_ARB_point_sprite
|
||||
#define GL_ARB_point_sprite 1
|
||||
|
||||
#define GL_POINT_SPRITE_ARB 0x8861
|
||||
#define GL_COORD_REPLACE_ARB 0x8862
|
||||
|
||||
#endif /* GL_ARB_point_sprite */
|
||||
|
||||
|
||||
#ifndef GL_MESA_program_debug
|
||||
#define GL_MESA_program_debug 1
|
||||
|
||||
|
@@ -40,6 +40,10 @@
|
||||
#define GLAPIENTRY
|
||||
#endif
|
||||
|
||||
#ifndef GLAPIENTRYP
|
||||
#define GLAPIENTRYP GLAPIENTRY *
|
||||
#endif
|
||||
|
||||
#ifndef GLAPI
|
||||
#define GLAPI
|
||||
#endif
|
||||
@@ -266,7 +270,7 @@ typedef GLUtesselator GLUtriangulatorObj;
|
||||
#define GLU_TESS_MAX_COORD 1.0e150
|
||||
|
||||
/* Internal convenience typedefs */
|
||||
typedef void (GLAPIENTRY *_GLUfuncptr)();
|
||||
typedef void (GLAPIENTRYP _GLUfuncptr)();
|
||||
|
||||
GLAPI void GLAPIENTRY gluBeginCurve (GLUnurbs* nurb);
|
||||
GLAPI void GLAPIENTRY gluBeginPolygon (GLUtesselator* tess);
|
||||
|
@@ -80,5 +80,7 @@
|
||||
#define gluBuild3DMipmaps mgluBuild3DMipmaps
|
||||
#define gluCheckExtension mgluCheckExtension
|
||||
#define gluUnProject4 mgluUnProject4
|
||||
#define gluNurbsCallbackData mgluNurbsCallbackData
|
||||
#define gluNurbsCallbackDataEXT mgluNurbsCallbackDataEXT
|
||||
|
||||
#endif
|
||||
|
@@ -648,7 +648,7 @@ GLUTAPI void GLUTAPIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned in
|
||||
#endif
|
||||
|
||||
/* GLUT color index sub-API. */
|
||||
GLUTAPI void GLUTAPIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
|
||||
GLUTAPI void GLUTAPIENTRY glutSetColor(int ndx, GLfloat red, GLfloat green, GLfloat blue);
|
||||
GLUTAPI GLfloat GLUTAPIENTRY glutGetColor(int ndx, int component);
|
||||
GLUTAPI void GLUTAPIENTRY glutCopyColormap(int win);
|
||||
|
||||
|
@@ -11,7 +11,6 @@
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#define GL_GLEXT_LEGACY
|
||||
#include <GL/glut.h>
|
||||
|
||||
|
||||
|
@@ -34,8 +34,6 @@ static GLboolean UseObj = GL_FALSE;
|
||||
|
||||
static void draw( void )
|
||||
{
|
||||
glDepthFunc(GL_EQUAL);
|
||||
/* glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );*/
|
||||
glClear( GL_COLOR_BUFFER_BIT );
|
||||
|
||||
glColor3f( 1.0, 1.0, 1.0 );
|
||||
|
@@ -50,7 +50,7 @@ CC = mingw32-gcc
|
||||
CFLAGS = -Wall -W -pedantic
|
||||
CFLAGS += -O2 -ffast-math -mcpu=$(CPU)
|
||||
CFLAGS += -I$(TOP)/include -I../util
|
||||
CFLAGS += -DGLUT_DISABLE_ATEXIT_HACK
|
||||
CFLAGS += -DGLUT_DISABLE_ATEXIT_HACK -D_STDCALL_SUPPORTED
|
||||
CFLAGS += -D_WINDEF_ -D_WINGDI_
|
||||
|
||||
LD = mingw32-g++
|
||||
|
@@ -159,12 +159,48 @@ static void SpecialKey( int key, int x, int y )
|
||||
static void MakeObject1(struct object *obj)
|
||||
{
|
||||
GLfloat *v, *c;
|
||||
void *p;
|
||||
int i;
|
||||
GLubyte buffer[500];
|
||||
|
||||
for (i = 0; i < 500; i++)
|
||||
buffer[i] = i & 0xff;
|
||||
|
||||
glGenBuffersARB(1, &obj->BufferID);
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, obj->BufferID);
|
||||
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 1000, NULL, GL_STATIC_DRAW_ARB);
|
||||
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 500, buffer, GL_STATIC_DRAW_ARB);
|
||||
|
||||
for (i = 0; i < 500; i++)
|
||||
buffer[i] = 0;
|
||||
|
||||
glGetBufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, 500, buffer);
|
||||
|
||||
for (i = 0; i < 500; i++)
|
||||
assert(buffer[i] == (i & 0xff));
|
||||
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_MAPPED_ARB, &i);
|
||||
assert(!i);
|
||||
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_USAGE_ARB, &i);
|
||||
|
||||
v = (GLfloat *) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
|
||||
|
||||
/* do some sanity tests */
|
||||
glGetBufferPointervARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_MAP_POINTER_ARB, &p);
|
||||
assert(p == v);
|
||||
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_SIZE_ARB, &i);
|
||||
assert(i == 500);
|
||||
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_USAGE_ARB, &i);
|
||||
assert(i == GL_STATIC_DRAW_ARB);
|
||||
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_ACCESS_ARB, &i);
|
||||
assert(i == GL_WRITE_ONLY_ARB);
|
||||
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_MAPPED_ARB, &i);
|
||||
assert(i);
|
||||
|
||||
/* Make rectangle */
|
||||
v[0] = -1; v[1] = -1; v[2] = 0;
|
||||
v[3] = 1; v[4] = -1; v[5] = 0;
|
||||
@@ -181,6 +217,12 @@ static void MakeObject1(struct object *obj)
|
||||
obj->NumElements = 0;
|
||||
|
||||
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
|
||||
|
||||
glGetBufferPointervARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_MAP_POINTER_ARB, &p);
|
||||
assert(!p);
|
||||
|
||||
glGetBufferParameterivARB(GL_ARRAY_BUFFER_ARB, GL_BUFFER_MAPPED_ARB, &i);
|
||||
assert(!i);
|
||||
}
|
||||
|
||||
|
||||
@@ -212,20 +254,18 @@ static void MakeObject2(struct object *obj)
|
||||
|
||||
static void MakeObject3(struct object *obj)
|
||||
{
|
||||
GLfloat vertexData[1000];
|
||||
GLfloat *v, *c;
|
||||
GLuint *i;
|
||||
|
||||
glGenBuffersARB(1, &obj->BufferID);
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, obj->BufferID);
|
||||
glBufferDataARB(GL_ARRAY_BUFFER_ARB, 1000, NULL, GL_STATIC_DRAW_ARB);
|
||||
v = (GLfloat *) glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB);
|
||||
int bytes;
|
||||
|
||||
/* Make rectangle */
|
||||
v = vertexData;
|
||||
v[0] = -1; v[1] = -0.5; v[2] = 0;
|
||||
v[3] = 1; v[4] = -0.5; v[5] = 0;
|
||||
v[6] = 1; v[7] = 0.5; v[8] = 0;
|
||||
v[9] = -1; v[10] = 0.5; v[11] = 0;
|
||||
c = v + 12;
|
||||
c = vertexData + 12;
|
||||
c[0] = 0; c[1] = 0; c[2] = 1;
|
||||
c[3] = 0; c[4] = 0; c[5] = 1;
|
||||
c[6] = 0; c[7] = 1; c[8] = 1;
|
||||
@@ -234,7 +274,12 @@ static void MakeObject3(struct object *obj)
|
||||
obj->VertexOffset = 0;
|
||||
obj->ColorOffset = 3 * sizeof(GLfloat) * obj->NumVerts;
|
||||
|
||||
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
|
||||
bytes = obj->NumVerts * (3 + 3) * sizeof(GLfloat);
|
||||
|
||||
/* Don't use glMap/UnmapBuffer for this object */
|
||||
glGenBuffersARB(1, &obj->BufferID);
|
||||
glBindBufferARB(GL_ARRAY_BUFFER_ARB, obj->BufferID);
|
||||
glBufferDataARB(GL_ARRAY_BUFFER_ARB, bytes, vertexData, GL_STATIC_DRAW_ARB);
|
||||
|
||||
/* Setup a buffer of indices to test the ELEMENTS path */
|
||||
glGenBuffersARB(1, &obj->ElementsBufferID);
|
||||
|
389
progs/tests/texcmp.c
Normal file
389
progs/tests/texcmp.c
Normal file
@@ -0,0 +1,389 @@
|
||||
/*
|
||||
* Compressed texture demo. Written by Daniel Borca.
|
||||
* This program is in the public domain.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#define GL_GLEXT_PROTOTYPES 1
|
||||
#include <GL/glut.h>
|
||||
|
||||
#include "readtex.c" /* I know, this is a hack. */
|
||||
#define TEXTURE_FILE "../images/tree2.rgba"
|
||||
|
||||
|
||||
static float Rot = 0.0;
|
||||
static GLboolean Anim = 1;
|
||||
|
||||
typedef struct {
|
||||
GLubyte *data;
|
||||
GLuint size;
|
||||
GLenum format;
|
||||
GLuint w, h;
|
||||
|
||||
GLenum TC;
|
||||
|
||||
GLubyte *cData;
|
||||
GLuint cSize;
|
||||
GLenum cFormat;
|
||||
} TEXTURE;
|
||||
|
||||
static TEXTURE *Tx, t1, t2, t3;
|
||||
static GLboolean fxt1, dxtc, s3tc;
|
||||
|
||||
|
||||
static const char *TextureName (GLenum TC)
|
||||
{
|
||||
switch (TC) {
|
||||
case GL_RGBA:
|
||||
return "RGBA";
|
||||
case GL_COMPRESSED_RGB:
|
||||
return "COMPRESSED_RGB";
|
||||
case GL_COMPRESSED_RGBA:
|
||||
return "COMPRESSED_RGBA";
|
||||
case GL_COMPRESSED_RGB_FXT1_3DFX:
|
||||
return "GL_COMPRESSED_RGB_FXT1_3DFX";
|
||||
case GL_COMPRESSED_RGBA_FXT1_3DFX:
|
||||
return "GL_COMPRESSED_RGBA_FXT1_3DFX";
|
||||
case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
|
||||
return "GL_COMPRESSED_RGB_S3TC_DXT1_EXT";
|
||||
case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
|
||||
return "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT";
|
||||
case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
|
||||
return "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT";
|
||||
case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
|
||||
return "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT";
|
||||
case GL_RGB_S3TC:
|
||||
return "GL_RGB_S3TC";
|
||||
case GL_RGB4_S3TC:
|
||||
return "GL_RGB4_S3TC";
|
||||
case GL_RGBA_S3TC:
|
||||
return "GL_RGBA_S3TC";
|
||||
case GL_RGBA4_S3TC:
|
||||
return "GL_RGBA4_S3TC";
|
||||
default:
|
||||
return "?";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
PrintString(const char *s)
|
||||
{
|
||||
while (*s) {
|
||||
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
|
||||
s++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void Idle( void )
|
||||
{
|
||||
float t = glutGet(GLUT_ELAPSED_TIME) * 0.001; /* in seconds */
|
||||
Rot = t * 360 / 4; /* 1 rotation per 4 seconds */
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
static void Display( void )
|
||||
{
|
||||
/* draw background gradient */
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glBegin(GL_POLYGON);
|
||||
glColor3f(1.0, 0.0, 0.2); glVertex2f(-1.5, -1.0);
|
||||
glColor3f(1.0, 0.0, 0.2); glVertex2f( 1.5, -1.0);
|
||||
glColor3f(0.0, 0.0, 1.0); glVertex2f( 1.5, 1.0);
|
||||
glColor3f(0.0, 0.0, 1.0); glVertex2f(-1.5, 1.0);
|
||||
glEnd();
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(Rot, 0, 0, 1);
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBegin(GL_POLYGON);
|
||||
glTexCoord2f(0, 1); glVertex2f(-1, -0.5);
|
||||
glTexCoord2f(1, 1); glVertex2f( 1, -0.5);
|
||||
glTexCoord2f(1, 0); glVertex2f( 1, 0.5);
|
||||
glTexCoord2f(0, 0); glVertex2f(-1, 0.5);
|
||||
glEnd();
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
/* info */
|
||||
glColor4f(1, 1, 1, 1);
|
||||
|
||||
glRasterPos3f(-1.2, -0.7, 0);
|
||||
PrintString("Selected: ");
|
||||
PrintString(TextureName(Tx->TC));
|
||||
if (Tx->cData) {
|
||||
char tmp[64];
|
||||
glRasterPos3f(-1.2, -0.8, 0);
|
||||
PrintString("Internal: ");
|
||||
PrintString(TextureName(Tx->cFormat));
|
||||
glRasterPos3f(-1.2, -0.9, 0);
|
||||
PrintString("Size : ");
|
||||
sprintf(tmp, "%d (%d%% of %d)", Tx->cSize, Tx->cSize * 100 / Tx->size, Tx->size);
|
||||
PrintString(tmp);
|
||||
}
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
static void Reshape( int width, int height )
|
||||
{
|
||||
glViewport( 0, 0, width, height );
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glOrtho( -1.5, 1.5, -1.0, 1.0, -1.0, 1.0 );
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
|
||||
static void ReInit( GLenum TC, TEXTURE *Tx )
|
||||
{
|
||||
GLint rv;
|
||||
|
||||
if ((Tx->TC == TC) && (Tx->cData != NULL)) {
|
||||
glCompressedTexImage2DARB(GL_TEXTURE_2D, /* target */
|
||||
0, /* level */
|
||||
Tx->cFormat, /* real format */
|
||||
Tx->w, /* original width */
|
||||
Tx->h, /* original height */
|
||||
0, /* border */
|
||||
Tx->cSize, /* compressed size*/
|
||||
Tx->cData); /* compressed data*/
|
||||
} else {
|
||||
glTexImage2D(GL_TEXTURE_2D, /* target */
|
||||
0, /* level */
|
||||
TC, /* internal format */
|
||||
Tx->w, Tx->h, /* width, height */
|
||||
0, /* border */
|
||||
Tx->format, /* texture format */
|
||||
GL_UNSIGNED_BYTE, /* texture type */
|
||||
Tx->data); /* the texture */
|
||||
|
||||
/* okay, now cache the compressed texture */
|
||||
Tx->TC = TC;
|
||||
if (Tx->cData != NULL) {
|
||||
free(Tx->cData);
|
||||
Tx->cData = NULL;
|
||||
}
|
||||
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_ARB, &rv);
|
||||
if (rv) {
|
||||
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, (GLint *)&Tx->cFormat);
|
||||
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB, (GLint *)&Tx->cSize);
|
||||
if ((Tx->cData = malloc(Tx->cSize)) != NULL) {
|
||||
glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, Tx->cData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void Init( void )
|
||||
{
|
||||
/* HEIGHT * WIDTH + 1 (for trailing '\0') */
|
||||
static char pattern[8 * 32 + 1] = {"\
|
||||
\
|
||||
MMM EEEE SSS AAA \
|
||||
M M M E S S A A \
|
||||
M M M EEEE SS A A \
|
||||
M M M E SS AAAAA \
|
||||
M M E S S A A \
|
||||
M M EEEE SSS A A \
|
||||
"
|
||||
};
|
||||
|
||||
GLuint i, j;
|
||||
|
||||
GLubyte (*texture1)[8 * 32][4];
|
||||
GLubyte (*texture2)[256][256][4];
|
||||
|
||||
t1.w = 32;
|
||||
t1.h = 8;
|
||||
t1.size = t1.w * t1.h * 4;
|
||||
t1.data = malloc(t1.size);
|
||||
t1.format = GL_RGBA;
|
||||
t1.TC = GL_RGBA;
|
||||
|
||||
texture1 = (GLubyte (*)[8 * 32][4])t1.data;
|
||||
for (i = 0; i < sizeof(pattern) - 1; i++) {
|
||||
switch (pattern[i]) {
|
||||
default:
|
||||
case ' ':
|
||||
(*texture1)[i][0] = 255;
|
||||
(*texture1)[i][1] = 255;
|
||||
(*texture1)[i][2] = 255;
|
||||
(*texture1)[i][3] = 64;
|
||||
break;
|
||||
case 'M':
|
||||
(*texture1)[i][0] = 255;
|
||||
(*texture1)[i][1] = 0;
|
||||
(*texture1)[i][2] = 0;
|
||||
(*texture1)[i][3] = 255;
|
||||
break;
|
||||
case 'E':
|
||||
(*texture1)[i][0] = 0;
|
||||
(*texture1)[i][1] = 255;
|
||||
(*texture1)[i][2] = 0;
|
||||
(*texture1)[i][3] = 255;
|
||||
break;
|
||||
case 'S':
|
||||
(*texture1)[i][0] = 0;
|
||||
(*texture1)[i][1] = 0;
|
||||
(*texture1)[i][2] = 255;
|
||||
(*texture1)[i][3] = 255;
|
||||
break;
|
||||
case 'A':
|
||||
(*texture1)[i][0] = 255;
|
||||
(*texture1)[i][1] = 255;
|
||||
(*texture1)[i][2] = 0;
|
||||
(*texture1)[i][3] = 255;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
t2.w = 256;
|
||||
t2.h = 256;
|
||||
t2.size = t2.w * t2.h * 4;
|
||||
t2.data = malloc(t2.size);
|
||||
t2.format = GL_RGBA;
|
||||
t2.TC = GL_RGBA;
|
||||
|
||||
texture2 = (GLubyte (*)[256][256][4])t2.data;
|
||||
for (j = 0; j < t2.h; j++) {
|
||||
for (i = 0; i < t2.w; i++) {
|
||||
(*texture2)[j][i][0] = sqrt(i * j * 255 * 255 / (t2.w * t2.h));
|
||||
(*texture2)[j][i][1] = 0;
|
||||
(*texture2)[j][i][2] = 0;
|
||||
(*texture2)[j][i][3] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
t3.data = LoadRGBImage(TEXTURE_FILE, (GLint *)&t3.w, (GLint *)&t3.h, &t3.format);
|
||||
t3.size = t3.w * t3.h * ((t3.format == GL_RGB) ? 3 : 4);
|
||||
t3.TC = GL_RGBA;
|
||||
|
||||
ReInit(GL_RGBA, Tx = &t1);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
}
|
||||
|
||||
|
||||
static void Key( unsigned char key, int x, int y )
|
||||
{
|
||||
(void) x;
|
||||
(void) y;
|
||||
switch (key) {
|
||||
case 27:
|
||||
exit(0);
|
||||
break;
|
||||
case ' ':
|
||||
Anim = !Anim;
|
||||
if (Anim)
|
||||
glutIdleFunc( Idle );
|
||||
else
|
||||
glutIdleFunc( NULL );
|
||||
break;
|
||||
case 't':
|
||||
if (Tx == &t1) {
|
||||
Tx = &t2;
|
||||
} else if (Tx == &t2) {
|
||||
Tx = &t3;
|
||||
} else {
|
||||
Tx = &t1;
|
||||
}
|
||||
ReInit(Tx->TC, Tx);
|
||||
break;
|
||||
case '0':
|
||||
ReInit(GL_RGBA, Tx);
|
||||
break;
|
||||
case '1':
|
||||
ReInit(GL_COMPRESSED_RGB, Tx);
|
||||
break;
|
||||
case '2':
|
||||
ReInit(GL_COMPRESSED_RGBA, Tx);
|
||||
break;
|
||||
case '3':
|
||||
if (fxt1) ReInit(GL_COMPRESSED_RGB_FXT1_3DFX, Tx);
|
||||
break;
|
||||
case '4':
|
||||
if (fxt1) ReInit(GL_COMPRESSED_RGBA_FXT1_3DFX, Tx);
|
||||
break;
|
||||
case '5':
|
||||
if (dxtc) ReInit(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, Tx);
|
||||
break;
|
||||
case '6':
|
||||
if (dxtc) ReInit(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, Tx);
|
||||
break;
|
||||
case '7':
|
||||
if (dxtc) ReInit(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, Tx);
|
||||
break;
|
||||
case '8':
|
||||
if (dxtc) ReInit(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, Tx);
|
||||
break;
|
||||
case 'a':
|
||||
if (s3tc) ReInit(GL_RGB_S3TC, Tx);
|
||||
break;
|
||||
case 's':
|
||||
if (s3tc) ReInit(GL_RGB4_S3TC, Tx);
|
||||
break;
|
||||
case 'd':
|
||||
if (s3tc) ReInit(GL_RGBA_S3TC, Tx);
|
||||
break;
|
||||
case 'f':
|
||||
if (s3tc) ReInit(GL_RGBA4_S3TC, Tx);
|
||||
break;
|
||||
}
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
glutInit( &argc, argv );
|
||||
glutInitWindowPosition( 0, 0 );
|
||||
glutInitWindowSize( 400, 300 );
|
||||
|
||||
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
|
||||
|
||||
if (glutCreateWindow(argv[0]) <= 0) {
|
||||
printf("Couldn't create window\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (!glutExtensionSupported("GL_ARB_texture_compression")) {
|
||||
printf("Sorry, GL_ARB_texture_compression not supported\n");
|
||||
exit(0);
|
||||
}
|
||||
if (glutExtensionSupported("GL_3DFX_texture_compression_FXT1")) {
|
||||
fxt1 = GL_TRUE;
|
||||
}
|
||||
if (glutExtensionSupported("GL_EXT_texture_compression_s3tc")) {
|
||||
dxtc = GL_TRUE;
|
||||
}
|
||||
if (glutExtensionSupported("GL_S3_s3tc")) {
|
||||
s3tc = GL_TRUE;
|
||||
}
|
||||
|
||||
Init();
|
||||
|
||||
glutReshapeFunc( Reshape );
|
||||
glutKeyboardFunc( Key );
|
||||
glutDisplayFunc( Display );
|
||||
if (Anim)
|
||||
glutIdleFunc( Idle );
|
||||
|
||||
glutMainLoop();
|
||||
return 0;
|
||||
}
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
** gluos.h - operating system dependencies for GLU
|
||||
**
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/include/gluos.h,v 1.5 2003/02/12 16:04:07 brianp Exp $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/include/gluos.h,v 1.5.4.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
#ifdef __VMS
|
||||
#ifdef __cplusplus
|
||||
@@ -11,8 +11,28 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <stdlib.h> /* For _MAX_PATH definition */
|
||||
#ifdef __WATCOMC__
|
||||
/* Disable *lots* of warnings to get a clean build. I can't be bothered fixing the
|
||||
* code at the moment, as it is pretty ugly.
|
||||
*/
|
||||
#pragma warning 7 10
|
||||
#pragma warning 13 10
|
||||
#pragma warning 14 10
|
||||
#pragma warning 367 10
|
||||
#pragma warning 379 10
|
||||
#pragma warning 726 10
|
||||
#pragma warning 836 10
|
||||
#endif
|
||||
|
||||
#ifdef BUILD_FOR_SNAP
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
|
||||
#elif defined(_WIN32)
|
||||
|
||||
#include <stdlib.h> /* For _MAX_PATH definition */
|
||||
#include <stdio.h>
|
||||
#include <malloc.h>
|
||||
|
||||
|
@@ -31,10 +31,10 @@
|
||||
** published by SGI, but has not been independently verified as being
|
||||
** compliant with the OpenGL(R) version 1.2.1 Specification.
|
||||
**
|
||||
** $Date: 2001/11/29 16:16:55 $ $Revision: 1.2 $
|
||||
** $Date: 2003/11/21 15:49:25 $ $Revision: 1.2.14.1 $
|
||||
*/
|
||||
/*
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/bezierEval.cc,v 1.2 2001/11/29 16:16:55 kschultz Exp $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/bezierEval.cc,v 1.2.14.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -43,6 +43,10 @@
|
||||
#include <math.h>
|
||||
#include "bezierEval.h"
|
||||
|
||||
#ifdef __WATCOMC__
|
||||
#pragma warning 14 10
|
||||
#endif
|
||||
|
||||
#define TOLERANCE 0.0001
|
||||
|
||||
#ifndef MAX_ORDER
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* glcurveval.h
|
||||
*
|
||||
* $Date: 2003/04/30 15:20:37 $ $Revision: 1.5 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glcurveval.h,v 1.5 2003/04/30 15:20:37 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.5.2.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glcurveval.h,v 1.5.2.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#ifndef __gluglcurveval_h_
|
||||
@@ -72,7 +72,7 @@ typedef struct curveEvalMachine{
|
||||
class OpenGLCurveEvaluator : public BasicCurveEvaluator {
|
||||
public:
|
||||
OpenGLCurveEvaluator(void);
|
||||
~OpenGLCurveEvaluator(void);
|
||||
virtual ~OpenGLCurveEvaluator(void);
|
||||
void range1f(long, REAL *, REAL *);
|
||||
void domain1f(REAL, REAL);
|
||||
void addMap(CurveMap *);
|
||||
|
@@ -31,10 +31,10 @@
|
||||
** published by SGI, but has not been independently verified as being
|
||||
** compliant with the OpenGL(R) version 1.2.1 Specification.
|
||||
**
|
||||
** $Date: 2001/03/17 00:25:40 $ $Revision: 1.1 $
|
||||
** $Date: 2003/11/21 15:49:25 $ $Revision: 1.1.16.1 $
|
||||
*/
|
||||
/*
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glrenderer.cc,v 1.1 2001/03/17 00:25:40 brianp Exp $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glrenderer.cc,v 1.1.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "gluos.h"
|
||||
@@ -165,7 +165,7 @@ GLUnurbs::grabGLMatrix(GLfloat vmat[4][4])
|
||||
::glGetFloatv((GLenum) GL_MODELVIEW_MATRIX, (GLfloat *) &(m1[0][0]));
|
||||
::glGetFloatv((GLenum) GL_PROJECTION_MATRIX, (GLfloat *) &(m2[0][0]));
|
||||
multmatrix4d((GLfloat (*)[4]) vmat,
|
||||
(GLfloat (*)[4]) m1, (GLfloat (*)[4]) m2);
|
||||
(const GLfloat (*)[4]) m1, (const GLfloat (*)[4]) m2);
|
||||
}
|
||||
|
||||
//for object space tesselation: view independent
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* glsurfeval.c++
|
||||
*
|
||||
* $Date: 2001/07/16 15:46:42 $ $Revision: 1.2 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glsurfeval.cc,v 1.2 2001/07/16 15:46:42 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.2.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glsurfeval.cc,v 1.2.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
/* Polynomial Evaluator Interface */
|
||||
@@ -74,10 +74,10 @@ static int STAT_num_of_quad_strips=0;
|
||||
/*#define FOR_CHRIS*/
|
||||
#ifdef FOR_CHRIS
|
||||
extern "C" { void evalUStripExt(int n_upper, REAL v_upper, REAL* upper_val,
|
||||
int n_lower, REAL v_lower, REAL* lower_val);}
|
||||
int n_lower, REAL v_lower, REAL* lower_val);}
|
||||
|
||||
extern "C" { void evalVStripExt(int n_left, REAL u_left, REAL* left_val,
|
||||
int n_right, REAL u_right, REAL* right_val);
|
||||
int n_right, REAL u_right, REAL* right_val);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -361,7 +361,7 @@ OpenGLSurfaceEvaluator::evalUStrip(int n_upper, REAL v_upper, REAL* upper_val, i
|
||||
/*
|
||||
*the algorithm works by scanning from left to right.
|
||||
*leftMostV: the left most of the remaining verteces (on both upper and lower).
|
||||
* it could an element of upperVerts or lowerVerts.
|
||||
* it could an element of upperVerts or lowerVerts.
|
||||
*i: upperVerts[i] is the first vertex to the right of leftMostV on upper line
|
||||
*j: lowerVerts[j] is the first vertex to the right of leftMostV on lower line
|
||||
*/
|
||||
@@ -394,129 +394,129 @@ OpenGLSurfaceEvaluator::evalUStrip(int n_upper, REAL v_upper, REAL* upper_val, i
|
||||
while(1)
|
||||
{
|
||||
if(i >= n_upper) /*case1: no more in upper*/
|
||||
{
|
||||
if(j<n_lower-1) /*at least two vertices in lower*/
|
||||
{
|
||||
bgntfan();
|
||||
{
|
||||
if(j<n_lower-1) /*at least two vertices in lower*/
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(leftMostV[0], leftMostV[1]);
|
||||
// glNormal3fv(leftMostNormal);
|
||||
// glVertex3fv(leftMostXYZ);
|
||||
// glVertex3fv(leftMostXYZ);
|
||||
|
||||
while(j<n_lower){
|
||||
while(j<n_lower){
|
||||
coord2f(lower_val[j], v_lower);
|
||||
// glNormal3fv(lowerNormal[j]);
|
||||
// glVertex3fv(lowerXYZ[j]);
|
||||
j++;
|
||||
|
||||
}
|
||||
endtfan();
|
||||
}
|
||||
break; /*exit the main loop*/
|
||||
}
|
||||
}
|
||||
endtfan();
|
||||
}
|
||||
break; /*exit the main loop*/
|
||||
}
|
||||
else if(j>= n_lower) /*case2: no more in lower*/
|
||||
{
|
||||
if(i<n_upper-1) /*at least two vertices in upper*/
|
||||
{
|
||||
bgntfan();
|
||||
{
|
||||
if(i<n_upper-1) /*at least two vertices in upper*/
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(leftMostV[0], leftMostV[1]);
|
||||
// glNormal3fv(leftMostNormal);
|
||||
// glVertex3fv(leftMostXYZ);
|
||||
|
||||
for(k=n_upper-1; k>=i; k--) /*reverse order for two-side lighting*/
|
||||
for(k=n_upper-1; k>=i; k--) /*reverse order for two-side lighting*/
|
||||
{
|
||||
coord2f(upper_val[k], v_upper);
|
||||
// glNormal3fv(upperNormal[k]);
|
||||
// glVertex3fv(upperXYZ[k]);
|
||||
}
|
||||
|
||||
endtfan();
|
||||
}
|
||||
break; /*exit the main loop*/
|
||||
}
|
||||
endtfan();
|
||||
}
|
||||
break; /*exit the main loop*/
|
||||
}
|
||||
else /* case3: neither is empty, plus the leftMostV, there is at least one triangle to output*/
|
||||
{
|
||||
if(upper_val[i] <= lower_val[j])
|
||||
{
|
||||
{
|
||||
if(upper_val[i] <= lower_val[j])
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(lower_val[j], v_lower);
|
||||
// glNormal3fv(lowerNormal[j]);
|
||||
// glVertex3fv(lowerXYZ[j]);
|
||||
|
||||
/*find the last k>=i such that
|
||||
*upperverts[k][0] <= lowerverts[j][0]
|
||||
*/
|
||||
k=i;
|
||||
/*find the last k>=i such that
|
||||
*upperverts[k][0] <= lowerverts[j][0]
|
||||
*/
|
||||
k=i;
|
||||
|
||||
while(k<n_upper)
|
||||
{
|
||||
if(upper_val[k] > lower_val[j])
|
||||
break;
|
||||
k++;
|
||||
while(k<n_upper)
|
||||
{
|
||||
if(upper_val[k] > lower_val[j])
|
||||
break;
|
||||
k++;
|
||||
|
||||
}
|
||||
k--;
|
||||
}
|
||||
k--;
|
||||
|
||||
|
||||
for(l=k; l>=i; l--)/*the reverse is for two-side lighting*/
|
||||
{
|
||||
for(l=k; l>=i; l--)/*the reverse is for two-side lighting*/
|
||||
{
|
||||
coord2f(upper_val[l], v_upper);
|
||||
// glNormal3fv(upperNormal[l]);
|
||||
// glVertex3fv(upperXYZ[l]);
|
||||
|
||||
}
|
||||
}
|
||||
coord2f(leftMostV[0], leftMostV[1]);
|
||||
// glNormal3fv(leftMostNormal);
|
||||
// glVertex3fv(leftMostXYZ);
|
||||
|
||||
endtfan();
|
||||
endtfan();
|
||||
|
||||
/*update i and leftMostV for next loop
|
||||
*/
|
||||
i = k+1;
|
||||
/*update i and leftMostV for next loop
|
||||
*/
|
||||
i = k+1;
|
||||
|
||||
leftMostV[0] = upper_val[k];
|
||||
leftMostV[1] = v_upper;
|
||||
// leftMostNormal = upperNormal[k];
|
||||
// leftMostXYZ = upperXYZ[k];
|
||||
}
|
||||
else /*upperVerts[i][0] > lowerVerts[j][0]*/
|
||||
{
|
||||
}
|
||||
else /*upperVerts[i][0] > lowerVerts[j][0]*/
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(upper_val[i], v_upper);
|
||||
// glNormal3fv(upperNormal[i]);
|
||||
// glVertex3fv(upperXYZ[i]);
|
||||
|
||||
coord2f(leftMostV[0], leftMostV[1]);
|
||||
// glNormal3fv(leftMostNormal);
|
||||
// glNormal3fv(leftMostNormal);
|
||||
// glVertex3fv(leftMostXYZ);
|
||||
|
||||
|
||||
/*find the last k>=j such that
|
||||
*lowerverts[k][0] < upperverts[i][0]
|
||||
*/
|
||||
k=j;
|
||||
while(k< n_lower)
|
||||
{
|
||||
if(lower_val[k] >= upper_val[i])
|
||||
break;
|
||||
/*find the last k>=j such that
|
||||
*lowerverts[k][0] < upperverts[i][0]
|
||||
*/
|
||||
k=j;
|
||||
while(k< n_lower)
|
||||
{
|
||||
if(lower_val[k] >= upper_val[i])
|
||||
break;
|
||||
coord2f(lower_val[k], v_lower);
|
||||
// glNormal3fv(lowerNormal[k]);
|
||||
// glVertex3fv(lowerXYZ[k]);
|
||||
|
||||
k++;
|
||||
}
|
||||
endtfan();
|
||||
k++;
|
||||
}
|
||||
endtfan();
|
||||
|
||||
/*update j and leftMostV for next loop
|
||||
*/
|
||||
j=k;
|
||||
/*update j and leftMostV for next loop
|
||||
*/
|
||||
j=k;
|
||||
leftMostV[0] = lower_val[j-1];
|
||||
leftMostV[1] = v_lower;
|
||||
|
||||
// leftMostNormal = lowerNormal[j-1];
|
||||
// leftMostXYZ = lowerXYZ[j-1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//clean up
|
||||
// free(upperXYZ);
|
||||
@@ -548,7 +548,7 @@ OpenGLSurfaceEvaluator::evalVStrip(int n_left, REAL u_left, REAL* left_val, int
|
||||
/*
|
||||
*the algorithm works by scanning from bot to top.
|
||||
*botMostV: the bot most of the remaining verteces (on both left and right).
|
||||
* it could an element of leftVerts or rightVerts.
|
||||
* it could an element of leftVerts or rightVerts.
|
||||
*i: leftVerts[i] is the first vertex to the top of botMostV on left line
|
||||
*j: rightVerts[j] is the first vertex to the top of botMostV on rightline
|
||||
*/
|
||||
@@ -580,126 +580,126 @@ OpenGLSurfaceEvaluator::evalVStrip(int n_left, REAL u_left, REAL* left_val, int
|
||||
while(1)
|
||||
{
|
||||
if(i >= n_left) /*case1: no more in left*/
|
||||
{
|
||||
if(j<n_right-1) /*at least two vertices in right*/
|
||||
{
|
||||
bgntfan();
|
||||
{
|
||||
if(j<n_right-1) /*at least two vertices in right*/
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(botMostV[0], botMostV[1]);
|
||||
while(j<n_right){
|
||||
while(j<n_right){
|
||||
coord2f(u_right, right_val[j]);
|
||||
// glNormal3fv(rightNormal[j]);
|
||||
// glVertex3fv(rightXYZ[j]);
|
||||
j++;
|
||||
|
||||
}
|
||||
endtfan();
|
||||
}
|
||||
break; /*exit the main loop*/
|
||||
}
|
||||
}
|
||||
endtfan();
|
||||
}
|
||||
break; /*exit the main loop*/
|
||||
}
|
||||
else if(j>= n_right) /*case2: no more in right*/
|
||||
{
|
||||
if(i<n_left-1) /*at least two vertices in left*/
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(botMostV[0], botMostV[1]);
|
||||
{
|
||||
if(i<n_left-1) /*at least two vertices in left*/
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(botMostV[0], botMostV[1]);
|
||||
// glNormal3fv(botMostNormal);
|
||||
// glVertex3fv(botMostXYZ);
|
||||
|
||||
for(k=n_left-1; k>=i; k--) /*reverse order for two-side lighting*/
|
||||
for(k=n_left-1; k>=i; k--) /*reverse order for two-side lighting*/
|
||||
{
|
||||
coord2f(u_left, left_val[k]);
|
||||
// glNormal3fv(leftNormal[k]);
|
||||
// glVertex3fv(leftXYZ[k]);
|
||||
}
|
||||
|
||||
endtfan();
|
||||
}
|
||||
break; /*exit the main loop*/
|
||||
}
|
||||
endtfan();
|
||||
}
|
||||
break; /*exit the main loop*/
|
||||
}
|
||||
else /* case3: neither is empty, plus the botMostV, there is at least one triangle to output*/
|
||||
{
|
||||
if(left_val[i] <= right_val[j])
|
||||
{
|
||||
{
|
||||
if(left_val[i] <= right_val[j])
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(u_right, right_val[j]);
|
||||
// glNormal3fv(rightNormal[j]);
|
||||
// glVertex3fv(rightXYZ[j]);
|
||||
|
||||
/*find the last k>=i such that
|
||||
*leftverts[k][0] <= rightverts[j][0]
|
||||
*/
|
||||
k=i;
|
||||
/*find the last k>=i such that
|
||||
*leftverts[k][0] <= rightverts[j][0]
|
||||
*/
|
||||
k=i;
|
||||
|
||||
while(k<n_left)
|
||||
{
|
||||
if(left_val[k] > right_val[j])
|
||||
break;
|
||||
k++;
|
||||
while(k<n_left)
|
||||
{
|
||||
if(left_val[k] > right_val[j])
|
||||
break;
|
||||
k++;
|
||||
|
||||
}
|
||||
k--;
|
||||
}
|
||||
k--;
|
||||
|
||||
|
||||
for(l=k; l>=i; l--)/*the reverse is for two-side lighting*/
|
||||
{
|
||||
for(l=k; l>=i; l--)/*the reverse is for two-side lighting*/
|
||||
{
|
||||
coord2f(u_left, left_val[l]);
|
||||
// glNormal3fv(leftNormal[l]);
|
||||
// glVertex3fv(leftXYZ[l]);
|
||||
|
||||
}
|
||||
}
|
||||
coord2f(botMostV[0], botMostV[1]);
|
||||
// glNormal3fv(botMostNormal);
|
||||
// glVertex3fv(botMostXYZ);
|
||||
|
||||
endtfan();
|
||||
endtfan();
|
||||
|
||||
/*update i and botMostV for next loop
|
||||
*/
|
||||
i = k+1;
|
||||
/*update i and botMostV for next loop
|
||||
*/
|
||||
i = k+1;
|
||||
|
||||
botMostV[0] = u_left;
|
||||
botMostV[1] = left_val[k];
|
||||
// botMostNormal = leftNormal[k];
|
||||
// botMostXYZ = leftXYZ[k];
|
||||
}
|
||||
else /*left_val[i] > right_val[j])*/
|
||||
{
|
||||
}
|
||||
else /*left_val[i] > right_val[j])*/
|
||||
{
|
||||
bgntfan();
|
||||
coord2f(u_left, left_val[i]);
|
||||
// glNormal3fv(leftNormal[i]);
|
||||
// glVertex3fv(leftXYZ[i]);
|
||||
|
||||
coord2f(botMostV[0], botMostV[1]);
|
||||
// glNormal3fv(botMostNormal);
|
||||
// glNormal3fv(botMostNormal);
|
||||
// glVertex3fv(botMostXYZ);
|
||||
|
||||
|
||||
/*find the last k>=j such that
|
||||
*rightverts[k][0] < leftverts[i][0]
|
||||
*/
|
||||
k=j;
|
||||
while(k< n_right)
|
||||
{
|
||||
if(right_val[k] >= left_val[i])
|
||||
break;
|
||||
/*find the last k>=j such that
|
||||
*rightverts[k][0] < leftverts[i][0]
|
||||
*/
|
||||
k=j;
|
||||
while(k< n_right)
|
||||
{
|
||||
if(right_val[k] >= left_val[i])
|
||||
break;
|
||||
coord2f(u_right, right_val[k]);
|
||||
// glNormal3fv(rightNormal[k]);
|
||||
// glVertex3fv(rightXYZ[k]);
|
||||
|
||||
k++;
|
||||
}
|
||||
endtfan();
|
||||
k++;
|
||||
}
|
||||
endtfan();
|
||||
|
||||
/*update j and botMostV for next loop
|
||||
*/
|
||||
j=k;
|
||||
/*update j and botMostV for next loop
|
||||
*/
|
||||
j=k;
|
||||
botMostV[0] = u_right;
|
||||
botMostV[1] = right_val[j-1];
|
||||
|
||||
// botMostNormal = rightNormal[j-1];
|
||||
// botMostXYZ = rightXYZ[j-1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//clean up
|
||||
// free(leftXYZ);
|
||||
@@ -753,10 +753,10 @@ OpenGLSurfaceEvaluator::bgnmap2f(long)
|
||||
|
||||
/*
|
||||
auto_normal_flag = 1; //always output normal in callback mode.
|
||||
//we could have used the following code,
|
||||
//but Inspector doesn't have gl context
|
||||
//before it calls tessellator.
|
||||
//this way is temporary.
|
||||
//we could have used the following code,
|
||||
//but Inspector doesn't have gl context
|
||||
//before it calls tessellator.
|
||||
//this way is temporary.
|
||||
*/
|
||||
//NEWCALLBACK
|
||||
//if one of the two normal callback functions are set,
|
||||
@@ -777,7 +777,7 @@ OpenGLSurfaceEvaluator::bgnmap2f(long)
|
||||
if(glIsEnabled(GL_AUTO_NORMAL) == GL_TRUE)
|
||||
auto_normal_flag = 1;
|
||||
else if (callback_auto_normal == 1)
|
||||
auto_normal_flag = 1;
|
||||
auto_normal_flag = 1;
|
||||
else
|
||||
auto_normal_flag = 0;
|
||||
*/
|
||||
@@ -837,7 +837,7 @@ OpenGLSurfaceEvaluator::endmap2f(void)
|
||||
//bezierPatchMeshListPrint(global_bpm);
|
||||
//bezierPatchMeshListDraw(global_bpm);
|
||||
|
||||
// printf("num triangles=%i\n", bezierPatchMeshListNumTriangles(global_bpm));
|
||||
// printf("num triangles=%i\n", bezierPatchMeshListNumTriangles(global_bpm));
|
||||
|
||||
#ifdef USE_LOD
|
||||
#else
|
||||
@@ -873,15 +873,15 @@ glPopAttrib();
|
||||
void
|
||||
OpenGLSurfaceEvaluator::map2f(
|
||||
long _type,
|
||||
REAL _ulower, /* u lower domain coord */
|
||||
REAL _ulower, /* u lower domain coord */
|
||||
REAL _uupper, /* u upper domain coord */
|
||||
long _ustride, /* interpoint distance */
|
||||
long _uorder, /* parametric order */
|
||||
REAL _vlower, /* v lower domain coord */
|
||||
REAL _vupper, /* v upper domain coord */
|
||||
REAL _vlower, /* v lower domain coord */
|
||||
REAL _vupper, /* v upper domain coord */
|
||||
long _vstride, /* interpoint distance */
|
||||
long _vorder, /* parametric order */
|
||||
REAL *pts) /* control points */
|
||||
REAL *pts) /* control points */
|
||||
{
|
||||
#ifdef USE_INTERNAL_EVAL
|
||||
inMap2f((int) _type, (REAL) _ulower, (REAL) _uupper,
|
||||
@@ -1171,7 +1171,7 @@ return;
|
||||
if (vcount == 2) {
|
||||
vertexCache[0]->invoke(this);
|
||||
vertexCache[1]->invoke(this);
|
||||
coord2f(u,v);
|
||||
coord2f(u,v);
|
||||
|
||||
} else {
|
||||
vcount++;
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* glsurfeval.h
|
||||
*
|
||||
* $Date: 2001/08/07 17:34:11 $ $Revision: 1.4 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glsurfeval.h,v 1.4 2001/08/07 17:34:11 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.4.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/interface/glsurfeval.h,v 1.4.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#ifndef __gluglsurfeval_h_
|
||||
@@ -106,7 +106,7 @@ private:
|
||||
class OpenGLSurfaceEvaluator : public BasicSurfaceEvaluator {
|
||||
public:
|
||||
OpenGLSurfaceEvaluator();
|
||||
~OpenGLSurfaceEvaluator( void );
|
||||
virtual ~OpenGLSurfaceEvaluator( void );
|
||||
void polymode( long style );
|
||||
void range2f( long, REAL *, REAL * );
|
||||
void domain2f( REAL, REAL, REAL, REAL );
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* arc.c++
|
||||
*
|
||||
* $Date: 2002/11/01 23:35:07 $ $Revision: 1.2 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/arc.cc,v 1.2 2002/11/01 23:35:07 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.2.12.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/arc.cc,v 1.2.12.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -50,11 +50,11 @@
|
||||
#include "simplemath.h"
|
||||
|
||||
/* local preprocessor definitions */
|
||||
#define ZERO 0.00001/*0.000001*/
|
||||
#define ZERO 0.00001/*0.000001*/
|
||||
|
||||
const int Arc::bezier_tag = (1<<13);
|
||||
const int Arc::arc_tag = (1<<3);
|
||||
const int Arc::tail_tag = (1<<6);
|
||||
const int Arc::bezier_tag = (1<<13);
|
||||
const int Arc::arc_tag = (1<<3);
|
||||
const int Arc::tail_tag = (1<<6);
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
* makeSide - attach a pwl arc to an arc and mark it as a border arc
|
||||
@@ -125,22 +125,22 @@ Arc::getextrema( Arc_ptr extrema[4] )
|
||||
botpt = toppt = this->tail()[1];
|
||||
|
||||
for( Arc_ptr jarc = this->next; jarc != this; jarc = jarc->next ) {
|
||||
if ( jarc->tail()[0] < leftpt ||
|
||||
if ( jarc->tail()[0] < leftpt ||
|
||||
(jarc->tail()[0] <= leftpt && jarc->rhead()[0]<=leftpt)) {
|
||||
leftpt = jarc->pwlArc->pts->param[0];
|
||||
extrema[1] = jarc;
|
||||
}
|
||||
if ( jarc->tail()[0] > rightpt ||
|
||||
if ( jarc->tail()[0] > rightpt ||
|
||||
(jarc->tail()[0] >= rightpt && jarc->rhead()[0] >= rightpt)) {
|
||||
rightpt = jarc->pwlArc->pts->param[0];
|
||||
extrema[3] = jarc;
|
||||
}
|
||||
if ( jarc->tail()[1] < botpt ||
|
||||
(jarc->tail()[1] <= botpt && jarc->rhead()[1] <= botpt )) {
|
||||
if ( jarc->tail()[1] < botpt ||
|
||||
(jarc->tail()[1] <= botpt && jarc->rhead()[1] <= botpt )) {
|
||||
botpt = jarc->pwlArc->pts->param[1];
|
||||
extrema[2] = jarc;
|
||||
}
|
||||
if ( jarc->tail()[1] > toppt ||
|
||||
if ( jarc->tail()[1] > toppt ||
|
||||
(jarc->tail()[1] >= toppt && jarc->rhead()[1] >= toppt)) {
|
||||
toppt = jarc->pwlArc->pts->param[1];
|
||||
extrema[0] = jarc;
|
||||
@@ -160,7 +160,7 @@ Arc::show()
|
||||
#ifndef NDEBUG
|
||||
dprintf( "\tPWLARC NP: %d FL: 1\n", pwlArc->npts );
|
||||
for( int i = 0; i < pwlArc->npts; i++ ) {
|
||||
dprintf( "\t\tVERTEX %f %f\n", pwlArc->pts[i].param[0],
|
||||
dprintf( "\t\tVERTEX %f %f\n", pwlArc->pts[i].param[0],
|
||||
pwlArc->pts[i].param[1] );
|
||||
}
|
||||
#endif
|
||||
@@ -176,13 +176,6 @@ Arc::print( void )
|
||||
{
|
||||
Arc_ptr jarc = this;
|
||||
|
||||
if( ! this ) {
|
||||
#ifndef NDEBUG
|
||||
dprintf( "\n\nEMPTY TRIM\n\n" );
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
dprintf( "BGNTRIM\n" );
|
||||
#endif
|
||||
@@ -217,10 +210,10 @@ Arc::isDisconnected( void )
|
||||
#endif
|
||||
return 1;
|
||||
} else {
|
||||
/* average two points together */
|
||||
p0[0] = p1[0] = (p1[0] + p0[0]) * 0.5;
|
||||
p0[1] = p1[1] = (p1[1] + p0[1]) * 0.5;
|
||||
return 0;
|
||||
/* average two points together */
|
||||
p0[0] = p1[0] = (p1[0] + p0[0]) * 0.5;
|
||||
p0[1] = p1[1] = (p1[1] + p0[1]) * 0.5;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,23 +244,23 @@ Arc::check( void )
|
||||
do {
|
||||
assert( (jarc->pwlArc != 0) || (jarc->bezierArc != 0) );
|
||||
|
||||
if (jarc->prev == 0 || jarc->next == 0) {
|
||||
if (jarc->prev == 0 || jarc->next == 0) {
|
||||
#ifndef NDEBUG
|
||||
dprintf( "checkjarc:null next/prev pointer\n");
|
||||
jarc->print( );
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (jarc->next->prev != jarc) {
|
||||
if (jarc->next->prev != jarc) {
|
||||
#ifndef NDEBUG
|
||||
dprintf( "checkjarc: pointer linkage screwed up\n");
|
||||
jarc->print( );
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if( jarc->pwlArc ) {
|
||||
if( jarc->pwlArc ) {
|
||||
#ifndef NDEBUG
|
||||
assert( jarc->pwlArc->npts >= 1 );
|
||||
assert( jarc->pwlArc->npts < 100000 );
|
||||
@@ -316,13 +309,13 @@ Arc::check( void )
|
||||
}
|
||||
if( jarc->isbezier() ) {
|
||||
assert( jarc->pwlArc->npts == 2 );
|
||||
assert( (jarc->pwlArc->pts[0].param[0] == \
|
||||
jarc->pwlArc->pts[1].param[0]) ||\
|
||||
(jarc->pwlArc->pts[0].param[1] == \
|
||||
jarc->pwlArc->pts[1].param[1]) );
|
||||
assert( (jarc->pwlArc->pts[0].param[0] == \
|
||||
jarc->pwlArc->pts[1].param[0]) ||\
|
||||
(jarc->pwlArc->pts[0].param[1] == \
|
||||
jarc->pwlArc->pts[1].param[1]) );
|
||||
}
|
||||
}
|
||||
jarc = jarc->next;
|
||||
jarc = jarc->next;
|
||||
} while (jarc != this);
|
||||
return 1;
|
||||
}
|
||||
@@ -347,9 +340,9 @@ Arc::append( Arc_ptr jarc )
|
||||
if( jarc != 0 ) {
|
||||
next = jarc->next;
|
||||
prev = jarc;
|
||||
next->prev = prev->next = this;
|
||||
next->prev = prev->next = this;
|
||||
} else {
|
||||
next = prev = this;
|
||||
next = prev = this;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* arctessellator.c++
|
||||
*
|
||||
* $Date: 2002/11/01 23:35:07 $ $Revision: 1.2 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/arctess.cc,v 1.2 2002/11/01 23:35:07 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.2.12.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/arctess.cc,v 1.2.12.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "glimports.h"
|
||||
@@ -59,7 +59,7 @@
|
||||
*/
|
||||
|
||||
ArcTessellator::ArcTessellator( TrimVertexPool& t, Pool& p )
|
||||
: trimvertexpool(t), pwlarcpool(p)
|
||||
: pwlarcpool(p), trimvertexpool(t)
|
||||
{
|
||||
}
|
||||
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* basiccrveval.c++
|
||||
*
|
||||
* $Date: 2001/03/17 00:25:40 $ $Revision: 1.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/basiccrveval.cc,v 1.1 2001/03/17 00:25:40 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.1.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/basiccrveval.cc,v 1.1.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "mystdio.h"
|
||||
@@ -52,7 +52,7 @@ BasicCurveEvaluator::domain1f( REAL, REAL )
|
||||
}
|
||||
|
||||
void
|
||||
BasicCurveEvaluator::range1f( long type, REAL *, REAL * )
|
||||
BasicCurveEvaluator::range1f( long , REAL *, REAL * )
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
dprintf( "range1f\n" );
|
||||
|
@@ -35,14 +35,18 @@
|
||||
/*
|
||||
* basicsurfaceevaluator.c++
|
||||
*
|
||||
* $Date: 2001/03/17 00:25:40 $ $Revision: 1.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/basicsurfeval.cc,v 1.1 2001/03/17 00:25:40 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.1.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/basicsurfeval.cc,v 1.1.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "mystdio.h"
|
||||
#include "types.h"
|
||||
#include "basicsurfeval.h"
|
||||
|
||||
#ifdef __WATCOMC__
|
||||
#pragma warning 726 10
|
||||
#endif
|
||||
|
||||
void
|
||||
BasicSurfaceEvaluator::domain2f( REAL, REAL, REAL, REAL )
|
||||
{
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* coveandtiler.c++
|
||||
*
|
||||
* $Date: 2001/03/17 00:25:40 $ $Revision: 1.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/coveandtiler.cc,v 1.1 2001/03/17 00:25:40 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.1.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/coveandtiler.cc,v 1.1.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "glimports.h"
|
||||
@@ -52,7 +52,7 @@
|
||||
const int CoveAndTiler::MAXSTRIPSIZE = 1000;
|
||||
|
||||
CoveAndTiler::CoveAndTiler( Backend& b )
|
||||
: backend( b )
|
||||
: backend( b )
|
||||
{ }
|
||||
|
||||
CoveAndTiler::~CoveAndTiler( void )
|
||||
@@ -80,7 +80,7 @@ void
|
||||
CoveAndTiler::coveAndTile( void )
|
||||
{
|
||||
long ustart = (top.ustart >= bot.ustart) ? top.ustart : bot.ustart;
|
||||
long uend = (top.uend <= bot.uend) ? top.uend : bot.uend;
|
||||
long uend = (top.uend <= bot.uend) ? top.uend : bot.uend;
|
||||
if( ustart <= uend ) {
|
||||
tile( bot.vindex, ustart, uend );
|
||||
if( top.ustart >= bot.ustart )
|
||||
@@ -126,7 +126,7 @@ CoveAndTiler::coveAndTile( void )
|
||||
} else {
|
||||
tllv.set( bot.ustart-1, top.vindex );
|
||||
}
|
||||
coveLowerLeftNoGrid( tl );
|
||||
coveLowerLeftNoGrid( tl );
|
||||
}
|
||||
|
||||
TrimVertex brv, trv, *br, *tr;
|
||||
@@ -158,7 +158,7 @@ CoveAndTiler::coveAndTile( void )
|
||||
br = rl;
|
||||
brrv.set( rl );
|
||||
if( rf->param[0] < uarray.uarray[bot.uend+1] ) {
|
||||
assert( rf->param[0] >= uarray.uarray[bot.uend] );
|
||||
assert( rf->param[0] >= uarray.uarray[bot.uend] );
|
||||
trrv.set( rf );
|
||||
} else {
|
||||
trrv.set( bot.uend+1, top.vindex );
|
||||
@@ -207,7 +207,7 @@ CoveAndTiler::coveUpperRight( void )
|
||||
output( tgv );
|
||||
backend.swaptmesh();
|
||||
output( gv );
|
||||
coveUR();
|
||||
coveUR();
|
||||
backend.endtmesh();
|
||||
}
|
||||
|
||||
@@ -219,7 +219,7 @@ CoveAndTiler::coveUpperRightNoGrid( TrimVertex* br )
|
||||
output( right.next() );
|
||||
backend.swaptmesh();
|
||||
output( br );
|
||||
coveUR();
|
||||
coveUR();
|
||||
backend.endtmesh();
|
||||
}
|
||||
|
||||
@@ -238,7 +238,7 @@ CoveAndTiler::coveUR( )
|
||||
backend.swaptmesh();
|
||||
}
|
||||
} else while( 1 ) {
|
||||
if( vert->param[0] < uarray.uarray[gv.gparam[0]] ) {
|
||||
if( vert->param[0] < uarray.uarray[gv.gparam[0]] ) {
|
||||
output( vert );
|
||||
backend.swaptmesh();
|
||||
vert = right.next();
|
||||
@@ -250,7 +250,7 @@ CoveAndTiler::coveUR( )
|
||||
for( ; vert; vert = right.next() ) {
|
||||
output( vert );
|
||||
backend.swaptmesh();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -269,7 +269,7 @@ CoveAndTiler::coveUpperLeft( void )
|
||||
output( left.next() );
|
||||
output( gv );
|
||||
backend.swaptmesh();
|
||||
coveUL();
|
||||
coveUL();
|
||||
backend.endtmesh();
|
||||
}
|
||||
|
||||
@@ -281,7 +281,7 @@ CoveAndTiler::coveUpperLeftNoGrid( TrimVertex* bl )
|
||||
output( left.next() );
|
||||
output( bl );
|
||||
backend.swaptmesh();
|
||||
coveUL();
|
||||
coveUL();
|
||||
backend.endtmesh();
|
||||
}
|
||||
|
||||
@@ -330,7 +330,7 @@ CoveAndTiler::coveLowerLeft( void )
|
||||
output( bgv );
|
||||
backend.swaptmesh();
|
||||
output( gv );
|
||||
coveLL();
|
||||
coveLL();
|
||||
backend.endtmesh();
|
||||
}
|
||||
|
||||
@@ -342,7 +342,7 @@ CoveAndTiler::coveLowerLeftNoGrid( TrimVertex* tl )
|
||||
output( left.prev() );
|
||||
backend.swaptmesh();
|
||||
output( tl );
|
||||
coveLL( );
|
||||
coveLL( );
|
||||
backend.endtmesh();
|
||||
}
|
||||
|
||||
@@ -360,7 +360,7 @@ CoveAndTiler::coveLL()
|
||||
backend.swaptmesh();
|
||||
}
|
||||
} else while( 1 ) {
|
||||
if( vert->param[0] > uarray.uarray[gv.gparam[0]] ){
|
||||
if( vert->param[0] > uarray.uarray[gv.gparam[0]] ){
|
||||
output( vert );
|
||||
backend.swaptmesh();
|
||||
vert = left.prev();
|
||||
@@ -369,11 +369,11 @@ CoveAndTiler::coveLL()
|
||||
backend.swaptmesh();
|
||||
output( gv );
|
||||
if( gv.prevu() == top.ustart ) {
|
||||
for( ; vert; vert = left.prev() ) {
|
||||
for( ; vert; vert = left.prev() ) {
|
||||
output( vert );
|
||||
backend.swaptmesh();
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -391,7 +391,7 @@ CoveAndTiler::coveLowerRight( void )
|
||||
output( right.prev() );
|
||||
output( gv );
|
||||
backend.swaptmesh();
|
||||
coveLR();
|
||||
coveLR();
|
||||
backend.endtmesh( );
|
||||
}
|
||||
|
||||
@@ -403,7 +403,7 @@ CoveAndTiler::coveLowerRightNoGrid( TrimVertex* tr )
|
||||
output( right.prev() );
|
||||
output( tr );
|
||||
backend.swaptmesh();
|
||||
coveLR();
|
||||
coveLR();
|
||||
backend.endtmesh();
|
||||
}
|
||||
|
||||
@@ -421,7 +421,7 @@ CoveAndTiler::coveLR( )
|
||||
output( vert );
|
||||
}
|
||||
} else while( 1 ) {
|
||||
if( vert->param[0] < uarray.uarray[gv.gparam[0]] ) {
|
||||
if( vert->param[0] < uarray.uarray[gv.gparam[0]] ) {
|
||||
backend.swaptmesh();
|
||||
output( vert );
|
||||
vert = right.prev();
|
||||
@@ -430,11 +430,11 @@ CoveAndTiler::coveLR( )
|
||||
output( gv );
|
||||
backend.swaptmesh();
|
||||
if( gv.nextu() == top.uend ) {
|
||||
for( ; vert; vert = right.prev() ) {
|
||||
for( ; vert; vert = right.prev() ) {
|
||||
backend.swaptmesh();
|
||||
output( vert );
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* knotvector.c++
|
||||
*
|
||||
* $Date: 2001/03/17 00:25:41 $ $Revision: 1.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/knotvector.cc,v 1.1 2001/03/17 00:25:41 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.1.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/knotvector.cc,v 1.1.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "glimports.h"
|
||||
@@ -45,6 +45,9 @@
|
||||
#include "knotvector.h"
|
||||
#include "defines.h"
|
||||
|
||||
#ifdef __WATCOMC__
|
||||
#pragma warning 726 10
|
||||
#endif
|
||||
|
||||
void Knotvector::init( long _knotcount, long _stride, long _order, INREAL *_knotlist )
|
||||
{
|
||||
@@ -55,7 +58,7 @@ void Knotvector::init( long _knotcount, long _stride, long _order, INREAL *_knot
|
||||
assert( knotlist != 0 );
|
||||
|
||||
for( int i = 0; i != _knotcount; i++ )
|
||||
knotlist[i] = (Knot) _knotlist[i];
|
||||
knotlist[i] = (Knot) _knotlist[i];
|
||||
}
|
||||
|
||||
Knotvector::Knotvector( void )
|
||||
@@ -99,9 +102,9 @@ int Knotvector::validate( void )
|
||||
|
||||
/* kindex is currently the index of the last knot.
|
||||
* In the next loop it is decremented to ignore the last knot
|
||||
* and the loop stops when kindex is 2 so as to ignore the first
|
||||
* knot as well. These knots are not used in computing
|
||||
* knot multiplicities.
|
||||
* and the loop stops when kindex is 2 so as to ignore the first
|
||||
* knot as well. These knots are not used in computing
|
||||
* knot multiplicities.
|
||||
*/
|
||||
|
||||
long multi = 1;
|
||||
@@ -111,14 +114,14 @@ int Knotvector::validate( void )
|
||||
continue;
|
||||
}
|
||||
if ( multi > order ) {
|
||||
// knot multiplicity greater than order of spline
|
||||
// knot multiplicity greater than order of spline
|
||||
return( 5 );
|
||||
}
|
||||
multi = 1;
|
||||
}
|
||||
|
||||
if ( multi > order ) {
|
||||
// knot multiplicity greater than order of spline
|
||||
// knot multiplicity greater than order of spline
|
||||
return( 5 );
|
||||
}
|
||||
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* mymath.h
|
||||
*
|
||||
* $Date: 2001/08/13 16:52:18 $ $Revision: 1.2 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/mymath.h,v 1.2 2001/08/13 16:52:18 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.2.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/mymath.h,v 1.2.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#ifndef __glumymath_h_
|
||||
@@ -46,7 +46,7 @@
|
||||
#define sqrtf gl_fsqrt
|
||||
#endif
|
||||
|
||||
#if GLBUILD | STANDALONE
|
||||
#if defined(GLBUILD) || defined(STANDALONE)
|
||||
#define M_SQRT2 1.41421356237309504880
|
||||
#define ceilf myceilf
|
||||
#define floorf myfloorf
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* mysetjmp.h
|
||||
*
|
||||
* $Date: 2001/03/22 11:38:36 $ $Revision: 1.2 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/mysetjmp.h,v 1.2 2001/03/22 11:38:36 joukj Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.2.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/mysetjmp.h,v 1.2.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#ifndef __glumysetjmp_h_
|
||||
@@ -55,7 +55,7 @@ extern "C" int mysetjmp( JumpBuffer * );
|
||||
#define longjmp gl_longjmp
|
||||
#endif
|
||||
|
||||
#if LIBRARYBUILD | GLBUILD
|
||||
#if defined(LIBRARYBUILD) || defined(GLBUILD)
|
||||
#include <setjmp.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* nurbsinterfac.c++
|
||||
*
|
||||
* $Date: 2001/03/17 00:25:41 $ $Revision: 1.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/nurbsinterfac.cc,v 1.1 2001/03/17 00:25:41 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.1.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/nurbsinterfac.cc,v 1.1.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "glimports.h"
|
||||
@@ -66,9 +66,9 @@
|
||||
}
|
||||
|
||||
NurbsTessellator::NurbsTessellator( BasicCurveEvaluator &c, BasicSurfaceEvaluator& e)
|
||||
: subdivider( renderhints, backend ),
|
||||
: maplist( backend ),
|
||||
backend( c, e ),
|
||||
maplist( backend ),
|
||||
subdivider( renderhints, backend ),
|
||||
o_pwlcurvePool( sizeof( O_pwlcurve ), 32, "o_pwlcurvePool" ),
|
||||
o_nurbscurvePool( sizeof( O_nurbscurve ), 32, "o_nurbscurvePool"),
|
||||
o_curvePool( sizeof( O_curve ), 32, "o_curvePool" ),
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* nurbstess.h
|
||||
*
|
||||
* $Date: 2001/08/07 17:34:11 $ $Revision: 1.2 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/nurbstess.h,v 1.2 2001/08/07 17:34:11 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.2.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/nurbstess.h,v 1.2.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#ifndef __glunurbstess_h_
|
||||
@@ -60,7 +60,7 @@ class NurbsTessellator {
|
||||
public:
|
||||
NurbsTessellator( BasicCurveEvaluator &c,
|
||||
BasicSurfaceEvaluator &e );
|
||||
~NurbsTessellator( void );
|
||||
virtual ~NurbsTessellator( void );
|
||||
|
||||
void getnurbsproperty( long, INREAL * );
|
||||
void getnurbsproperty( long, long, INREAL * );
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
* subdivider.cxx
|
||||
*
|
||||
* $Date: 2001/03/17 00:25:41 $ $Revision: 1.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/subdivider.cc,v 1.1 2001/03/17 00:25:41 brianp Exp $
|
||||
* $Date: 2003/11/21 15:49:25 $ $Revision: 1.1.16.1 $
|
||||
* $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/internals/subdivider.cc,v 1.1.16.1 2003/11/21 15:49:25 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "glimports.h"
|
||||
@@ -112,13 +112,13 @@ Subdivider::makePatchBoundary( const REAL *from, const REAL *to )
|
||||
*/
|
||||
|
||||
Subdivider::Subdivider( Renderhints& r, Backend& b )
|
||||
: arcpool( sizeof( Arc), 1, "arcpool" ),
|
||||
: slicer( b ),
|
||||
arctessellator( trimvertexpool, pwlarcpool ),
|
||||
arcpool( sizeof( Arc), 1, "arcpool" ),
|
||||
bezierarcpool( sizeof( BezierArc ), 1, "Bezarcpool" ),
|
||||
pwlarcpool( sizeof( PwlArc ), 1, "Pwlarcpool" ),
|
||||
renderhints( r ),
|
||||
arctessellator( trimvertexpool, pwlarcpool ),
|
||||
backend( b ),
|
||||
slicer( b )
|
||||
backend( b )
|
||||
{
|
||||
}
|
||||
|
||||
|
@@ -31,10 +31,10 @@
|
||||
** published by SGI, but has not been independently verified as being
|
||||
** compliant with the OpenGL(R) version 1.2.1 Specification.
|
||||
**
|
||||
** $Date: 2001/11/29 16:16:55 $ $Revision: 1.2 $
|
||||
** $Date: 2003/11/21 15:49:26 $ $Revision: 1.2.14.1 $
|
||||
*/
|
||||
/*
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/nurbtess/directedLine.cc,v 1.2 2001/11/29 16:16:55 kschultz Exp $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/nurbtess/directedLine.cc,v 1.2.14.1 2003/11/21 15:49:26 keithw Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -47,6 +47,10 @@
|
||||
#include "directedLine.h"
|
||||
#include "polyDBG.h"
|
||||
|
||||
#ifdef __WATCOMC__
|
||||
#pragma warning 726 10
|
||||
#endif
|
||||
|
||||
//we must return the newLine
|
||||
directedLine* directedLine::deleteChain(directedLine* begin, directedLine* end)
|
||||
{
|
||||
@@ -412,7 +416,7 @@ Int compV2InX(Real A[2], Real B[2])
|
||||
*A vertex is the head of a directed line.
|
||||
*(x_1, y_1) <= (x_2, y_2) if
|
||||
*either y_1 < y_2
|
||||
*or y_1 == y_2 && x_1 < x_2.
|
||||
*or y_1 == y_2 && x_1 < x_2.
|
||||
*return -1 if this->head() <= nl->head(),
|
||||
*return 1 otherwise
|
||||
*/
|
||||
@@ -427,7 +431,7 @@ Int directedLine::compInY(directedLine* nl)
|
||||
*A vertex is the head of a directed line.
|
||||
*(x_1, y_1) <= (x_2, y_2) if
|
||||
*either x_1 < x_2
|
||||
*or x_1 == x_2 && y_1 < y_2.
|
||||
*or x_1 == x_2 && y_1 < y_2.
|
||||
*return -1 if this->head() <= nl->head(),
|
||||
*return 1 otherwise
|
||||
*/
|
||||
@@ -629,7 +633,7 @@ void directedLine::connectDiagonal(directedLine* v1, directedLine* v2,
|
||||
directedLine** ret_p1,
|
||||
directedLine** ret_p2,
|
||||
sampledLine** generatedLine,
|
||||
directedLine* polygonList )
|
||||
directedLine* polygonList )
|
||||
{
|
||||
sampledLine *nsline = new sampledLine(2);
|
||||
|
||||
@@ -651,12 +655,12 @@ void directedLine::connectDiagonal(directedLine* v1, directedLine* v2,
|
||||
directedLine* v1Prev = v1->prev;
|
||||
directedLine* v2Prev = v2->prev;
|
||||
|
||||
v1 ->prev = newLineDec;
|
||||
v1 ->prev = newLineDec;
|
||||
v2Prev ->next = newLineDec;
|
||||
newLineDec->next = v1;
|
||||
newLineDec->prev = v2Prev;
|
||||
|
||||
v2 ->prev = newLineInc;
|
||||
v2 ->prev = newLineInc;
|
||||
v1Prev ->next = newLineInc;
|
||||
newLineInc->next = v2;
|
||||
newLineInc->prev = v1Prev;
|
||||
@@ -671,10 +675,10 @@ void directedLine::connectDiagonal(directedLine* v1, directedLine* v2,
|
||||
void directedLine::connectDiagonal_2slines(directedLine* v1, directedLine* v2,
|
||||
directedLine** ret_p1,
|
||||
directedLine** ret_p2,
|
||||
directedLine* polygonList )
|
||||
directedLine* polygonList )
|
||||
{
|
||||
sampledLine *nsline = new sampledLine(2);
|
||||
sampledLine *nsline2 = new sampledLine(2);
|
||||
sampledLine *nsline2 = new sampledLine(2);
|
||||
|
||||
nsline->setPoint(0, v1->head());
|
||||
nsline->setPoint(1, v2->head());
|
||||
@@ -689,12 +693,12 @@ void directedLine::connectDiagonal_2slines(directedLine* v1, directedLine* v2,
|
||||
directedLine* v1Prev = v1->prev;
|
||||
directedLine* v2Prev = v2->prev;
|
||||
|
||||
v1 ->prev = newLineDec;
|
||||
v1 ->prev = newLineDec;
|
||||
v2Prev ->next = newLineDec;
|
||||
newLineDec->next = v1;
|
||||
newLineDec->prev = v2Prev;
|
||||
|
||||
v2 ->prev = newLineInc;
|
||||
v2 ->prev = newLineInc;
|
||||
v1Prev ->next = newLineInc;
|
||||
newLineInc->next = v2;
|
||||
newLineInc->prev = v1Prev;
|
||||
|
@@ -31,10 +31,10 @@
|
||||
** published by SGI, but has not been independently verified as being
|
||||
** compliant with the OpenGL(R) version 1.2.1 Specification.
|
||||
**
|
||||
** $Date: 2001/11/29 16:16:55 $ $Revision: 1.2 $
|
||||
** $Date: 2003/11/21 15:49:26 $ $Revision: 1.2.14.1 $
|
||||
*/
|
||||
/*
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/nurbtess/polyDBG.cc,v 1.2 2001/11/29 16:16:55 kschultz Exp $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/nurbtess/polyDBG.cc,v 1.2.14.1 2003/11/21 15:49:26 keithw Exp $
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -43,6 +43,11 @@
|
||||
#include "zlassert.h"
|
||||
#include "polyDBG.h"
|
||||
|
||||
#ifdef __WATCOMC__
|
||||
#pragma warning 14 10
|
||||
#pragma warning 391 10
|
||||
#pragma warning 726 10
|
||||
#endif
|
||||
|
||||
static Real area(Real A[2], Real B[2], Real C[2])
|
||||
{
|
||||
@@ -222,7 +227,7 @@ Int DBG_intersectChain(vertexArray* chain, Int start, Int end, Real A[2], Real B
|
||||
|
||||
/*determine whether a polygon intersect itself or not
|
||||
*return 1 is it does,
|
||||
* 0 otherwise
|
||||
* 0 otherwise
|
||||
*/
|
||||
Int DBG_polygonSelfIntersect(directedLine* poly)
|
||||
{
|
||||
@@ -424,7 +429,7 @@ printf("%i\n", DBG_pointInsidePoly(poly->head(),
|
||||
if(poly != temp)
|
||||
if(DBG_pointInsidePoly(poly->head(), temp))
|
||||
count++;
|
||||
/* printf("count=%i\n", count);*/
|
||||
/* printf("count=%i\n", count);*/
|
||||
}
|
||||
return count;
|
||||
}
|
||||
@@ -651,8 +656,8 @@ static directedLine* DBG_cutIntersectionPoly_notwork(directedLine *polygon)
|
||||
for(temp=end->getNext(); temp!=begin; temp= temp->getNext())
|
||||
{
|
||||
//printf("temp=(%f,%f)\n", temp->head()[0], temp->head()[1]);
|
||||
directedLine *intersect = DBG_edgeIntersectChainD(temp, begin, end);
|
||||
if(intersect != NULL)
|
||||
directedLine *intersect = DBG_edgeIntersectChainD(temp, begin, end);
|
||||
if(intersect != NULL)
|
||||
{
|
||||
crt = crt->deleteChain(intersect, temp);
|
||||
find=1;
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
** Author: Eric Veach, July 1994.
|
||||
**
|
||||
** $Date: 2001/03/17 00:25:41 $ $Revision: 1.1 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libtess/geom.h,v 1.1 2001/03/17 00:25:41 brianp Exp $
|
||||
** $Date: 2003/11/21 15:49:26 $ $Revision: 1.1.16.1 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libtess/geom.h,v 1.1.16.1 2003/11/21 15:49:26 keithw Exp $
|
||||
*/
|
||||
|
||||
#ifndef __geom_h_
|
||||
@@ -58,8 +58,8 @@
|
||||
((u)->s == (v)->s && (u)->t <= (v)->t))
|
||||
#endif
|
||||
|
||||
#define EdgeEval(u,v,w) __gl_edgeEval(u,v,w)
|
||||
#define EdgeSign(u,v,w) __gl_edgeSign(u,v,w)
|
||||
#define EdgeEval(u,v,w) __gl_edgeEval(u,v,w)
|
||||
#define EdgeSign(u,v,w) __gl_edgeSign(u,v,w)
|
||||
|
||||
/* Versions of VertLeq, EdgeSign, EdgeEval with s and t transposed. */
|
||||
|
||||
@@ -69,11 +69,12 @@
|
||||
#define TransSign(u,v,w) __gl_transSign(u,v,w)
|
||||
|
||||
|
||||
#define EdgeGoesLeft(e) VertLeq( (e)->Dst, (e)->Org )
|
||||
#define EdgeGoesLeft(e) VertLeq( (e)->Dst, (e)->Org )
|
||||
#define EdgeGoesRight(e) VertLeq( (e)->Org, (e)->Dst )
|
||||
|
||||
#undef ABS
|
||||
#define ABS(x) ((x) < 0 ? -(x) : (x))
|
||||
#define VertL1dist(u,v) (ABS(u->s - v->s) + ABS(u->t - v->t))
|
||||
#define VertL1dist(u,v) (ABS(u->s - v->s) + ABS(u->t - v->t))
|
||||
|
||||
#define VertCCW(u,v,w) __gl_vertCCW(u,v,w)
|
||||
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
** Author: Eric Veach, July 1994.
|
||||
**
|
||||
** $Date: 2002/11/01 23:45:31 $ $Revision: 1.2 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libtess/normal.c,v 1.2 2002/11/01 23:45:31 brianp Exp $
|
||||
** $Date: 2003/11/21 15:49:26 $ $Revision: 1.2.12.1 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libtess/normal.c,v 1.2.12.1 2003/11/21 15:49:26 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "gluos.h"
|
||||
@@ -64,6 +64,7 @@ static void Normalize( GLdouble v[3] )
|
||||
}
|
||||
#endif
|
||||
|
||||
#undef ABS
|
||||
#define ABS(x) ((x) < 0 ? -(x) : (x))
|
||||
|
||||
static int LongAxis( GLdouble v[3] )
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
** Author: Eric Veach, July 1994.
|
||||
**
|
||||
** $Date: 2002/11/07 14:17:05 $ $Revision: 1.5 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libtess/sweep.c,v 1.5 2002/11/07 14:17:05 brianp Exp $
|
||||
** $Date: 2003/11/21 15:49:26 $ $Revision: 1.5.12.1 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libtess/sweep.c,v 1.5.12.1 2003/11/21 15:49:26 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "gluos.h"
|
||||
@@ -92,6 +92,8 @@ extern void DebugEvent( GLUtesselator *tess );
|
||||
* when it is necessary.)
|
||||
*/
|
||||
|
||||
#undef MAX
|
||||
#undef MIN
|
||||
#define MAX(x,y) ((x) >= (y) ? (x) : (y))
|
||||
#define MIN(x,y) ((x) <= (y) ? (x) : (y))
|
||||
|
||||
@@ -99,7 +101,7 @@ extern void DebugEvent( GLUtesselator *tess );
|
||||
* winding of the new edge.
|
||||
*/
|
||||
#define AddWinding(eDst,eSrc) (eDst->winding += eSrc->winding, \
|
||||
eDst->Sym->winding += eSrc->Sym->winding)
|
||||
eDst->Sym->winding += eSrc->Sym->winding)
|
||||
|
||||
static void SweepEvent( GLUtesselator *tess, GLUvertex *vEvent );
|
||||
static void WalkDirtyRegions( GLUtesselator *tess, ActiveRegion *regUp );
|
||||
@@ -292,7 +294,7 @@ static GLUhalfEdge *FinishLeftRegions( GLUtesselator *tess,
|
||||
* active region to the face, since at this point each face will belong
|
||||
* to at most one region (this was not necessarily true until this point
|
||||
* in the sweep). The walk stops at the region above regLast; if regLast
|
||||
* is NULL we walk as far as possible. At the same time we relink the
|
||||
* is NULL we walk as far as possible. At the same time we relink the
|
||||
* mesh if necessary, so that the ordering of edges around vOrg is the
|
||||
* same as in the dictionary.
|
||||
*/
|
||||
@@ -453,7 +455,7 @@ static void SpliceMergeVertices( GLUtesselator *tess, GLUhalfEdge *e1,
|
||||
}
|
||||
|
||||
static void VertexWeights( GLUvertex *isect, GLUvertex *org, GLUvertex *dst,
|
||||
GLfloat *weights )
|
||||
GLfloat *weights )
|
||||
/*
|
||||
* Find some weights which describe how the intersection vertex is
|
||||
* a linear combination of "org" and "dest". Each of the two edges
|
||||
@@ -682,7 +684,7 @@ static int CheckForIntersect( GLUtesselator *tess, ActiveRegion *regUp )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if( (! VertEq( dstUp, tess->event )
|
||||
if( (! VertEq( dstUp, tess->event )
|
||||
&& EdgeSign( dstUp, tess->event, &isect ) >= 0)
|
||||
|| (! VertEq( dstLo, tess->event )
|
||||
&& EdgeSign( dstLo, tess->event, &isect ) <= 0 ))
|
||||
@@ -813,7 +815,7 @@ static void WalkDirtyRegions( GLUtesselator *tess, ActiveRegion *regUp )
|
||||
if( eUp->Org != eLo->Org ) {
|
||||
if( eUp->Dst != eLo->Dst
|
||||
&& ! regUp->fixUpperEdge && ! regLo->fixUpperEdge
|
||||
&& (eUp->Dst == tess->event || eLo->Dst == tess->event) )
|
||||
&& (eUp->Dst == tess->event || eLo->Dst == tess->event) )
|
||||
{
|
||||
/* When all else fails in CheckForIntersect(), it uses tess->event
|
||||
* as the intersection location. To make this possible, it requires
|
||||
@@ -822,7 +824,7 @@ static void WalkDirtyRegions( GLUtesselator *tess, ActiveRegion *regUp )
|
||||
* case it might splice one of these edges into tess->event, and
|
||||
* violate the invariant that fixable edges are the only right-going
|
||||
* edge from their associated vertex).
|
||||
*/
|
||||
*/
|
||||
if( CheckForIntersect( tess, regUp )) {
|
||||
/* WalkDirtyRegions() was called recursively; we're done */
|
||||
return;
|
||||
@@ -846,7 +848,7 @@ static void WalkDirtyRegions( GLUtesselator *tess, ActiveRegion *regUp )
|
||||
|
||||
|
||||
static void ConnectRightVertex( GLUtesselator *tess, ActiveRegion *regUp,
|
||||
GLUhalfEdge *eBottomLeft )
|
||||
GLUhalfEdge *eBottomLeft )
|
||||
/*
|
||||
* Purpose: connect a "right" vertex vEvent (one where all edges go left)
|
||||
* to the unprocessed portion of the mesh. Since there are no right-going
|
||||
@@ -969,7 +971,7 @@ static void ConnectLeftDegenerate( GLUtesselator *tess,
|
||||
regUp->fixUpperEdge = FALSE;
|
||||
}
|
||||
if ( !__gl_meshSplice( vEvent->anEdge, e ) ) longjmp(tess->env,1);
|
||||
SweepEvent( tess, vEvent ); /* recurse */
|
||||
SweepEvent( tess, vEvent ); /* recurse */
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1075,7 +1077,7 @@ static void SweepEvent( GLUtesselator *tess, GLUvertex *vEvent )
|
||||
ActiveRegion *regUp, *reg;
|
||||
GLUhalfEdge *e, *eTopLeft, *eBottomLeft;
|
||||
|
||||
tess->event = vEvent; /* for access in EdgeLeq() */
|
||||
tess->event = vEvent; /* for access in EdgeLeq() */
|
||||
DebugEvent( tess );
|
||||
|
||||
/* Check if this vertex is the right endpoint of an edge that is
|
||||
@@ -1143,7 +1145,7 @@ static void AddSentinel( GLUtesselator *tess, GLdouble t )
|
||||
e->Org->t = t;
|
||||
e->Dst->s = -SENTINEL_COORD;
|
||||
e->Dst->t = t;
|
||||
tess->event = e->Dst; /* initialize it */
|
||||
tess->event = e->Dst; /* initialize it */
|
||||
|
||||
reg->eUp = e;
|
||||
reg->windingNumber = 0;
|
||||
@@ -1193,7 +1195,7 @@ static void DoneEdgeDict( GLUtesselator *tess )
|
||||
DeleteRegion( tess, reg );
|
||||
/* __gl_meshDelete( reg->eUp );*/
|
||||
}
|
||||
dictDeleteDict( tess->dict ); /* __gl_dictListDeleteDict */
|
||||
dictDeleteDict( tess->dict ); /* __gl_dictListDeleteDict */
|
||||
}
|
||||
|
||||
|
||||
|
@@ -35,8 +35,8 @@
|
||||
/*
|
||||
** Author: Eric Veach, July 1994.
|
||||
**
|
||||
** $Date: 2002/11/01 23:45:31 $ $Revision: 1.3 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libtess/tess.c,v 1.3 2002/11/01 23:45:31 brianp Exp $
|
||||
** $Date: 2003/11/21 15:49:26 $ $Revision: 1.3.12.1 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libtess/tess.c,v 1.3.12.1 2003/11/21 15:49:26 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "gluos.h"
|
||||
@@ -63,7 +63,7 @@
|
||||
/*ARGSUSED*/ static void GLAPIENTRY noEnd( void ) {}
|
||||
/*ARGSUSED*/ static void GLAPIENTRY noError( GLenum errnum ) {}
|
||||
/*ARGSUSED*/ static void GLAPIENTRY noCombine( GLdouble coords[3], void *data[4],
|
||||
GLfloat weight[4], void **dataOut ) {}
|
||||
GLfloat weight[4], void **dataOut ) {}
|
||||
/*ARGSUSED*/ static void GLAPIENTRY noMesh( GLUmesh *mesh ) {}
|
||||
|
||||
|
||||
@@ -85,9 +85,10 @@
|
||||
/* Half-edges are allocated in pairs (see mesh.c) */
|
||||
typedef struct { GLUhalfEdge e, eSym; } EdgePair;
|
||||
|
||||
#undef MAX
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
#define MAX_FAST_ALLOC (MAX(sizeof(EdgePair), \
|
||||
MAX(sizeof(GLUvertex),sizeof(GLUface))))
|
||||
MAX(sizeof(GLUvertex),sizeof(GLUface))))
|
||||
|
||||
|
||||
GLUtesselator * GLAPIENTRY
|
||||
@@ -170,7 +171,7 @@ static void GotoState( GLUtesselator *tess, enum TessState newState )
|
||||
gluTessBeginContour( tess );
|
||||
break;
|
||||
default:
|
||||
;
|
||||
;
|
||||
}
|
||||
} else {
|
||||
switch( tess->state ) {
|
||||
@@ -184,7 +185,7 @@ static void GotoState( GLUtesselator *tess, enum TessState newState )
|
||||
MakeDormant( tess );
|
||||
break;
|
||||
default:
|
||||
;
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -314,7 +315,7 @@ gluTessCallback( GLUtesselator *tess, GLenum which, _GLUfuncptr fn)
|
||||
return;
|
||||
case GLU_TESS_END_DATA:
|
||||
tess->callEndData = (fn == NULL) ? &__gl_noEndData :
|
||||
(void (GLAPIENTRY *)(void *)) fn;
|
||||
(void (GLAPIENTRY *)(void *)) fn;
|
||||
return;
|
||||
case GLU_TESS_ERROR:
|
||||
tess->callError = (fn == NULL) ? &noError : (void (GLAPIENTRY *)(GLenum)) fn;
|
||||
@@ -329,7 +330,7 @@ gluTessCallback( GLUtesselator *tess, GLenum which, _GLUfuncptr fn)
|
||||
return;
|
||||
case GLU_TESS_COMBINE_DATA:
|
||||
tess->callCombineData = (fn == NULL) ? &__gl_noCombineData :
|
||||
(void (GLAPIENTRY *)(GLdouble [3],
|
||||
(void (GLAPIENTRY *)(GLdouble [3],
|
||||
void *[4],
|
||||
GLfloat [4],
|
||||
void **,
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -31,8 +31,8 @@
|
||||
** published by SGI, but has not been independently verified as being
|
||||
** compliant with the OpenGL(R) version 1.2.1 Specification.
|
||||
**
|
||||
** $Date: 2002/11/01 23:45:31 $ $Revision: 1.3 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libutil/quad.c,v 1.3 2002/11/01 23:45:31 brianp Exp $
|
||||
** $Date: 2003/11/21 15:49:26 $ $Revision: 1.3.12.1 $
|
||||
** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libutil/quad.c,v 1.3.12.1 2003/11/21 15:49:26 keithw Exp $
|
||||
*/
|
||||
|
||||
#include "gluos.h"
|
||||
@@ -46,10 +46,11 @@
|
||||
/* Make it not a power of two to avoid cache thrashing on the chip */
|
||||
#define CACHE_SIZE 240
|
||||
|
||||
#define PI 3.14159265358979323846
|
||||
#undef PI
|
||||
#define PI 3.14159265358979323846
|
||||
|
||||
struct GLUquadric {
|
||||
GLint normals;
|
||||
GLint normals;
|
||||
GLboolean textureCoords;
|
||||
GLint orientation;
|
||||
GLint drawStyle;
|
||||
@@ -969,7 +970,7 @@ gluSphere(GLUquadric *qobj, GLdouble radius, GLint slices, GLint stacks)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
@@ -1046,7 +1047,7 @@ gluSphere(GLUquadric *qobj, GLdouble radius, GLint slices, GLint stacks)
|
||||
costemp2 = cosCache2b[j];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
}
|
||||
for (i = 0; i < slices; i++) {
|
||||
switch(qobj->normals) {
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.3 for DOS/DJGPP
|
||||
* PC/HW routine collection v1.4 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -19,6 +19,8 @@
|
||||
#define FALSE 0
|
||||
#define TRUE !FALSE
|
||||
|
||||
#define SQR(x) ((x) * (x))
|
||||
|
||||
#define MIN(x,y) (((x) < (y)) ? (x) : (y))
|
||||
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
|
||||
#define MID(x,y,z) MAX((x), MIN((y), (z)))
|
||||
@@ -201,6 +203,8 @@ int pc_keyshifts (void);
|
||||
* timer
|
||||
*/
|
||||
int pc_install_int (PFUNC func, void *parm, unsigned int freq);
|
||||
int pc_remove_int (int fid);
|
||||
int pc_adjust_int (int fid, unsigned int freq);
|
||||
void pc_remove_timer (void);
|
||||
|
||||
/*
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* PC/HW routine collection v1.3 for DOS/DJGPP
|
||||
* PC/HW routine collection v1.4 for DOS/DJGPP
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
|
||||
#include <pc.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "pc_hw.h"
|
||||
|
||||
@@ -17,6 +18,8 @@
|
||||
|
||||
#define PIT_FREQ 0x1234DD
|
||||
|
||||
#define ADJUST(timer, basefreq) timer.counter = PIT_FREQ * timer.freq / SQR(basefreq)
|
||||
|
||||
#define unvolatile(__v, __t) __extension__ ({union { volatile __t __cp; __t __p; } __q; __q.__cp = __v; __q.__p;})
|
||||
|
||||
static int timer_installed;
|
||||
@@ -29,15 +32,24 @@ typedef struct {
|
||||
|
||||
static TIMER timer_main, timer_func[MAX_TIMERS];
|
||||
|
||||
|
||||
|
||||
/* Desc: main timer callback
|
||||
*
|
||||
* In : -
|
||||
* Out : 0 to bypass BIOS, 1 to chain to BIOS
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
static int timer ()
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0;i<MAX_TIMERS;i++) {
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
TIMER *t = &timer_func[i];
|
||||
if (t->func) {
|
||||
t->clock_ticks += t->counter;
|
||||
if (t->clock_ticks>=timer_main.counter) {
|
||||
if (t->clock_ticks >= timer_main.counter) {
|
||||
t->clock_ticks -= timer_main.counter;
|
||||
t->func(unvolatile(t->parm, void *));
|
||||
}
|
||||
@@ -45,7 +57,7 @@ static int timer ()
|
||||
}
|
||||
|
||||
timer_main.clock_ticks += timer_main.counter;
|
||||
if (timer_main.clock_ticks>=0x10000) {
|
||||
if (timer_main.clock_ticks >= 0x10000) {
|
||||
timer_main.clock_ticks -= 0x10000;
|
||||
return 1;
|
||||
} else {
|
||||
@@ -54,6 +66,15 @@ static int timer ()
|
||||
}
|
||||
} ENDOFUNC(timer)
|
||||
|
||||
|
||||
|
||||
/* Desc: uninstall timer engine
|
||||
*
|
||||
* In : -
|
||||
* Out : -
|
||||
*
|
||||
* Note: -
|
||||
*/
|
||||
void pc_remove_timer (void)
|
||||
{
|
||||
if (timer_installed) {
|
||||
@@ -70,11 +91,22 @@ void pc_remove_timer (void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: install timer engine
|
||||
*
|
||||
* In : -
|
||||
* Out : 0 for success
|
||||
*
|
||||
* Note: initial frequency is 18.2 Hz
|
||||
*/
|
||||
static int install_timer (void)
|
||||
{
|
||||
if (timer_installed||pc_install_irq(TIMER_IRQ, timer)) {
|
||||
if (timer_installed || pc_install_irq(TIMER_IRQ, timer)) {
|
||||
return -1;
|
||||
} else {
|
||||
memset(timer_func, 0, sizeof(timer_func));
|
||||
|
||||
LOCKDATA(timer_func);
|
||||
LOCKDATA(timer_main);
|
||||
LOCKFUNC(timer);
|
||||
@@ -94,65 +126,198 @@ static int install_timer (void)
|
||||
}
|
||||
}
|
||||
|
||||
static TIMER *find_slot (PFUNC func)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0;i<MAX_TIMERS;i++) {
|
||||
if (timer_func[i].func==func) {
|
||||
return &timer_func[i];
|
||||
}
|
||||
}
|
||||
for (i=0;i<MAX_TIMERS;i++) {
|
||||
if (!timer_func[i].func) {
|
||||
return &timer_func[i];
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Desc: install timerfunc
|
||||
*
|
||||
* In : callback function, opaque pointer to be passed to callee, freq (Hz)
|
||||
* Out : timerfunc id (0 .. MAX_TIMERS-1)
|
||||
*
|
||||
* Note: returns -1 if error
|
||||
*/
|
||||
int pc_install_int (PFUNC func, void *parm, unsigned int freq)
|
||||
{
|
||||
int i;
|
||||
TIMER *t;
|
||||
TIMER *t = NULL;
|
||||
|
||||
/* ensure the timer engine is set up */
|
||||
if (!timer_installed) {
|
||||
if (install_timer()) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if ((t=find_slot(func))!=NULL) {
|
||||
/* find an empty slot */
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
if (!timer_func[i].func) {
|
||||
t = &timer_func[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (t == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
DISABLE();
|
||||
|
||||
t->func = func;
|
||||
t->parm = parm;
|
||||
t->freq = freq;
|
||||
t->clock_ticks = 0;
|
||||
|
||||
/* update main timer / sons to match highest frequency */
|
||||
if (freq > timer_main.freq) {
|
||||
unsigned int new_counter = PIT_FREQ / freq;
|
||||
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
if (timer_func[i].func) {
|
||||
ADJUST(timer_func[i], freq);
|
||||
}
|
||||
}
|
||||
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, (unsigned char)new_counter);
|
||||
outportb(0x40, (unsigned char)(new_counter>>8));
|
||||
timer_main.clock_ticks = 0;
|
||||
timer_main.counter = new_counter;
|
||||
timer_main.freq = freq;
|
||||
} else {
|
||||
/* t == &timer_func[i] */
|
||||
ADJUST(timer_func[i], timer_main.freq);
|
||||
}
|
||||
|
||||
ENABLE();
|
||||
|
||||
return t - timer_func;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: remove timerfunc
|
||||
*
|
||||
* In : timerfunc id
|
||||
* Out : 0 if success
|
||||
*
|
||||
* Note: tries to relax the main timer whenever possible
|
||||
*/
|
||||
int pc_remove_int (int fid)
|
||||
{
|
||||
int i;
|
||||
unsigned int freq = 0;
|
||||
|
||||
/* are we installed? */
|
||||
if (!timer_installed) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* sanity check */
|
||||
if ((fid < 0) || (fid >= MAX_TIMERS) || (timer_func[fid].func == NULL)) {
|
||||
return -1;
|
||||
}
|
||||
timer_func[fid].func = NULL;
|
||||
|
||||
/* scan for maximum frequency */
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
TIMER *t = &timer_func[i];
|
||||
if (t->func) {
|
||||
if (freq < t->freq) {
|
||||
freq = t->freq;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* if there are no callbacks left, cleanup */
|
||||
if (!freq) {
|
||||
pc_remove_timer();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if we just lowered the maximum frequency, try to relax the timer engine */
|
||||
if (freq < timer_main.freq) {
|
||||
unsigned int new_counter = PIT_FREQ / freq;
|
||||
|
||||
DISABLE();
|
||||
|
||||
t->func = func;
|
||||
t->parm = parm;
|
||||
t->freq = freq;
|
||||
t->clock_ticks = 0;
|
||||
|
||||
if (new_counter < timer_main.counter) {
|
||||
for (i=0;i<MAX_TIMERS;i++) {
|
||||
if (timer_func[i].func) {
|
||||
timer_func[i].counter = new_counter * timer_func[i].freq / freq;
|
||||
}
|
||||
}
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, (unsigned char)new_counter);
|
||||
outportb(0x40, (unsigned char)(new_counter>>8));
|
||||
timer_main.clock_ticks = 0;
|
||||
timer_main.counter = new_counter;
|
||||
timer_main.freq = freq;
|
||||
} else {
|
||||
t->counter = PIT_FREQ * freq / (timer_main.freq * timer_main.freq);
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
if (timer_func[i].func) {
|
||||
ADJUST(timer_func[i], freq);
|
||||
}
|
||||
}
|
||||
|
||||
ENABLE();
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, (unsigned char)new_counter);
|
||||
outportb(0x40, (unsigned char)(new_counter>>8));
|
||||
timer_main.clock_ticks = 0;
|
||||
timer_main.counter = new_counter;
|
||||
timer_main.freq = freq;
|
||||
|
||||
return 0;
|
||||
ENABLE();
|
||||
}
|
||||
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Desc: adjust timerfunc
|
||||
*
|
||||
* In : timerfunc id, new frequency (Hz)
|
||||
* Out : 0 if success
|
||||
*
|
||||
* Note: might change the main timer frequency
|
||||
*/
|
||||
int pc_adjust_int (int fid, unsigned int freq)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* are we installed? */
|
||||
if (!timer_installed) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* sanity check */
|
||||
if ((fid < 0) || (fid >= MAX_TIMERS) || (timer_func[fid].func == NULL)) {
|
||||
return -1;
|
||||
}
|
||||
timer_func[fid].freq = freq;
|
||||
|
||||
/* scan for maximum frequency */
|
||||
freq = 0;
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
TIMER *t = &timer_func[i];
|
||||
if (t->func) {
|
||||
if (freq < t->freq) {
|
||||
freq = t->freq;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* update main timer / sons to match highest frequency */
|
||||
DISABLE();
|
||||
|
||||
/* using '>' is correct still (and avoids updating
|
||||
* the HW timer too often), but doesn't relax the timer!
|
||||
*/
|
||||
if (freq != timer_main.freq) {
|
||||
unsigned int new_counter = PIT_FREQ / freq;
|
||||
|
||||
for (i = 0; i < MAX_TIMERS; i++) {
|
||||
if (timer_func[i].func) {
|
||||
ADJUST(timer_func[i], freq);
|
||||
}
|
||||
}
|
||||
|
||||
outportb(0x43, 0x34);
|
||||
outportb(0x40, (unsigned char)new_counter);
|
||||
outportb(0x40, (unsigned char)(new_counter>>8));
|
||||
timer_main.clock_ticks = 0;
|
||||
timer_main.counter = new_counter;
|
||||
timer_main.freq = freq;
|
||||
} else {
|
||||
ADJUST(timer_func[fid], timer_main.freq);
|
||||
}
|
||||
|
||||
ENABLE();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -27,6 +27,8 @@
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "glutint.h"
|
||||
|
||||
|
||||
@@ -140,3 +142,78 @@ int APIENTRY glutGetModifiers (void)
|
||||
|
||||
return mod;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* GAME MODE
|
||||
* Hack alert: incomplete... what is GameMode, anyway?
|
||||
*/
|
||||
GLint g_game;
|
||||
static GLboolean game_possible;
|
||||
static GLboolean game_active;
|
||||
static GLuint game_width;
|
||||
static GLuint game_height;
|
||||
static GLuint game_bpp;
|
||||
static GLuint game_refresh;
|
||||
|
||||
|
||||
|
||||
void APIENTRY glutGameModeString (const char *string)
|
||||
{
|
||||
if (sscanf(string, "%ux%u:%u@%u", &game_width, &game_height, &game_bpp, &game_refresh) == 4) {
|
||||
game_possible = GL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int APIENTRY glutGameModeGet (GLenum mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case GLUT_GAME_MODE_ACTIVE:
|
||||
return game_active;
|
||||
case GLUT_GAME_MODE_POSSIBLE:
|
||||
return game_possible && !g_curwin;
|
||||
case GLUT_GAME_MODE_WIDTH:
|
||||
return game_active ? (int)game_width : -1;
|
||||
case GLUT_GAME_MODE_HEIGHT:
|
||||
return game_active ? (int)game_height : -1;
|
||||
case GLUT_GAME_MODE_PIXEL_DEPTH:
|
||||
return game_active ? (int)game_bpp : -1;
|
||||
case GLUT_GAME_MODE_REFRESH_RATE:
|
||||
return game_active ? (int)game_refresh : -1;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int APIENTRY glutEnterGameMode (void)
|
||||
{
|
||||
if (glutGameModeGet(GLUT_GAME_MODE_POSSIBLE)) {
|
||||
g_bpp = game_bpp;
|
||||
g_refresh = game_refresh;
|
||||
|
||||
glutInitWindowSize(game_width, game_height);
|
||||
|
||||
if ((g_game = glutCreateWindow("<game>")) > 0) {
|
||||
game_active = GL_TRUE;
|
||||
}
|
||||
|
||||
return g_game;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void GLUTAPIENTRY glutLeaveGameMode (void)
|
||||
{
|
||||
if (glutGameModeGet(GLUT_GAME_MODE_ACTIVE)) {
|
||||
game_active = GL_FALSE;
|
||||
|
||||
glutDestroyWindow(g_game);
|
||||
}
|
||||
}
|
||||
|
@@ -55,7 +55,7 @@ char *__glutProgramName = "GGI";
|
||||
|
||||
static ggi_visual_t __glut_vis;
|
||||
|
||||
static GGIMesaContext __glut_ctx;
|
||||
static ggi_mesa_context_t __glut_ctx;
|
||||
|
||||
//static int __glut_width = WIDTH;
|
||||
//static int __glut_height = HEIGHT;
|
||||
|
@@ -36,6 +36,7 @@
|
||||
*/
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include "glheader.h"
|
||||
#include "glapi.h"
|
||||
#include "glapitable.h"
|
||||
|
||||
|
@@ -488,6 +488,12 @@ struct __DRIscreenPrivateRec {
|
||||
* the drawable that was bound. Otherwise, this is NULL.
|
||||
*/
|
||||
__DRIdrawablePrivate *fullscreen;
|
||||
|
||||
|
||||
/**
|
||||
* \brief Screen number for when multiple screens are supported
|
||||
*/
|
||||
int myNum;
|
||||
};
|
||||
|
||||
extern void
|
||||
|
@@ -31,7 +31,7 @@
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: miniglx.c,v 1.1 2003/08/22 20:11:43 brianp Exp $ */
|
||||
/* $Id: miniglx.c,v 1.1.2.1 2003/11/21 15:49:27 keithw Exp $ */
|
||||
|
||||
/**
|
||||
* \mainpage Mini GLX
|
||||
@@ -732,7 +732,7 @@ static int get_chipset_from_busid( Display *dpy )
|
||||
nr = sscanf(buf, "%04x\t%04x%04x", &encode,
|
||||
&vendor, &device);
|
||||
|
||||
bus = encode >> 16;
|
||||
bus = encode >> 8;
|
||||
dev = (encode & 0xFF) >> 3;
|
||||
fn = encode & 0x7;
|
||||
|
||||
|
300
src/mesa/Makefile.OSMesa16
Normal file
300
src/mesa/Makefile.OSMesa16
Normal file
@@ -0,0 +1,300 @@
|
||||
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 5.1
|
||||
# Copyright (C) 1995-2003 Brian Paul
|
||||
|
||||
# Makefile for building Mesa for 16/32-bit/channel rendering with the OSMesa
|
||||
# driver.
|
||||
|
||||
|
||||
##### MACROS #####
|
||||
|
||||
TOP = ../..
|
||||
|
||||
GL_MAJOR = 1
|
||||
GL_MINOR = 4
|
||||
GL_TINY = 0$(MESA_MAJOR)0$(MESA_MINOR)0$(MESA_TINY)
|
||||
|
||||
GL_LIB_NAME = "GL" # may be overridden in Make-config
|
||||
OSMESA_LIB_NAME = "OSMesa16" # may be overridden in Make-config
|
||||
|
||||
VPATH = RCS
|
||||
|
||||
LIBDIR = $(TOP)/lib
|
||||
|
||||
|
||||
### Lists of source files
|
||||
|
||||
MAIN_SOURCES = \
|
||||
main/api_arrayelt.c \
|
||||
main/api_loopback.c \
|
||||
main/api_noop.c \
|
||||
main/api_validate.c \
|
||||
main/accum.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
|
||||
|
||||
ASM_C_SOURCES = \
|
||||
x86/x86.c \
|
||||
x86/common_x86.c \
|
||||
x86/3dnow.c \
|
||||
x86/sse.c \
|
||||
sparc/sparc.c
|
||||
|
||||
X86_SOURCES = \
|
||||
x86/common_x86_asm.S \
|
||||
x86/glapi_x86.S \
|
||||
x86/x86_xform2.S \
|
||||
x86/x86_xform3.S \
|
||||
x86/x86_xform4.S \
|
||||
x86/x86_cliptest.S \
|
||||
x86/mmx_blend.S \
|
||||
x86/3dnow_xform1.S \
|
||||
x86/3dnow_xform2.S \
|
||||
x86/3dnow_xform3.S \
|
||||
x86/3dnow_xform4.S \
|
||||
x86/3dnow_normal.S \
|
||||
x86/sse_xform1.S \
|
||||
x86/sse_xform2.S \
|
||||
x86/sse_xform3.S \
|
||||
x86/sse_xform4.S \
|
||||
x86/sse_normal.S
|
||||
|
||||
SPARC_SOURCES = \
|
||||
sparc/clip.S \
|
||||
sparc/glapi_sparc.S \
|
||||
sparc/norm.S \
|
||||
sparc/xform.S
|
||||
|
||||
### Groups of files
|
||||
|
||||
CORE_SOURCES = \
|
||||
$(MAIN_SOURCES) \
|
||||
$(GLAPI_SOURCES) \
|
||||
$(MATH_SOURCES) \
|
||||
$(ARRAY_CACHE_SOURCES) \
|
||||
$(SWRAST_SOURCES) \
|
||||
$(SWRAST_SETUP_SOURCES) \
|
||||
$(TNL_SOURCES) \
|
||||
$(ASM_C_SOURCES)
|
||||
|
||||
# This will probably get set to $(X86_SOURCES) in Make-config:
|
||||
ASM_SOURCES =
|
||||
|
||||
OSMESA_DRIVER_SOURCES = \
|
||||
drivers/osmesa/osmesa.c
|
||||
|
||||
### Object files
|
||||
|
||||
CORE_OBJECTS = $(CORE_SOURCES:.c=.o)
|
||||
|
||||
ASM_OBJECTS = $(ASM_SOURCES:.S=.o)
|
||||
|
||||
OSMESA_OBJECTS = $(OSMESA_DRIVER_SOURCES:.c=.o)
|
||||
|
||||
OBJECTS = \
|
||||
$(CORE_OBJECTS) \
|
||||
$(ASM_OBJECTS) \
|
||||
$(OSMESA_OBJECTS)
|
||||
|
||||
|
||||
### Include directories
|
||||
|
||||
INCLUDE_DIRS = \
|
||||
-I$(TOP)/include \
|
||||
-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/swrast \
|
||||
-I$(TOP)/src/mesa/swrast_setup
|
||||
|
||||
##### RULES #####
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
|
||||
|
||||
.S.o:
|
||||
$(CC) -c $(INCLUDE_DIRS) $(CFLAGS) $< -o $@
|
||||
|
||||
|
||||
x86/matypes.h: main/mtypes.h tnl/t_context.h x86/gen_matypes.c
|
||||
$(CC) $(INCLUDE_DIRS) $(CFLAGS) x86/gen_matypes.c -o x86/gen_matypes
|
||||
./x86/gen_matypes > x86/matypes.h
|
||||
rm -f x86/gen_matypes x86/*.o
|
||||
|
||||
x86/common_x86_asm.o: x86/matypes.h
|
||||
|
||||
|
||||
|
||||
##### TARGETS #####
|
||||
|
||||
default:
|
||||
@echo "Specify a target configuration"
|
||||
|
||||
|
||||
targets: $(LIBDIR)/$(OSMESA16_LIB)
|
||||
|
||||
# Make the 16-bit/channel OSMesa library
|
||||
$(LIBDIR)/$(OSMESA16_LIB): $(OBJECTS)
|
||||
$(TOP)/bin/mklib $(MAKELIB_FLAGS) -o $(OSMESA_LIB_NAME) -major $(GL_MAJOR) \
|
||||
-minor $(GL_MINOR) -patch $(GL_TINY) -install $(LIBDIR) \
|
||||
$(GL_LIB_DEPS) $(OBJECTS)
|
||||
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Run 'make dep' to update the dependencies if you change what's included
|
||||
# by any source file.
|
||||
#
|
||||
dep: $(CORE_SOURCES) $(OSMESA_DRIVER_SOURCES) $(ASM_SOURCES)
|
||||
makedepend -fdepend -Y $(INCLUDE_DIRS) -DGGI -DSVGA -DFX \
|
||||
$(CORE_SOURCES) $(OSMESA_DRIVER_SOURCES) \
|
||||
$(ASM_SOURCES)
|
||||
|
||||
dep: $(CORE_SOURCES)
|
||||
makedepend -fdepend -Y -I../include $(CORE_SOURCES)
|
||||
|
||||
tags:
|
||||
etags `find . -name \*.[ch]` `find ../include`
|
||||
|
||||
|
||||
# Remove .o and backup files
|
||||
clean:
|
||||
-rm *.a
|
||||
-rm -f */*.o */*~ */*.o */*~
|
||||
-rm -f drivers/*/*.o
|
||||
|
||||
|
||||
include $(TOP)/Make-config
|
||||
|
||||
include depend
|
@@ -25,6 +25,7 @@ MAIN_SOURCES = \
|
||||
main/api_noop.c \
|
||||
main/api_validate.c \
|
||||
main/accum.c \
|
||||
main/arbparse.c \
|
||||
main/arbprogram.c \
|
||||
main/arbfragparse.c \
|
||||
main/arbvertparse.c \
|
||||
@@ -135,16 +136,10 @@ 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_save_api.c \
|
||||
tnl/t_save_loopback.c \
|
||||
tnl/t_save_playback.c \
|
||||
tnl/t_vb_fog.c \
|
||||
tnl/t_vb_light.c \
|
||||
tnl/t_vb_normals.c \
|
||||
@@ -153,7 +148,11 @@ TNL_SOURCES = \
|
||||
tnl/t_vb_render.c \
|
||||
tnl/t_vb_texgen.c \
|
||||
tnl/t_vb_texmat.c \
|
||||
tnl/t_vb_vertex.c
|
||||
tnl/t_vb_vertex.c \
|
||||
tnl/t_vtx_api.c \
|
||||
tnl/t_vtx_eval.c \
|
||||
tnl/t_vtx_exec.c
|
||||
|
||||
|
||||
ASM_C_SOURCES = \
|
||||
x86/common_x86.c \
|
||||
@@ -209,7 +208,8 @@ GLIDE_DRIVER_SOURCES = \
|
||||
drivers/glide/fxtexman.c \
|
||||
drivers/glide/fxtris.c \
|
||||
drivers/glide/fxvb.c \
|
||||
drivers/glide/fxglidew.c
|
||||
drivers/glide/fxglidew.c \
|
||||
drivers/glide/fxg.c
|
||||
|
||||
SVGA_DRIVER_SOURCES = \
|
||||
drivers/svga/svgamesa.c \
|
||||
@@ -228,19 +228,21 @@ CORE_SOURCES = \
|
||||
$(GLAPI_SOURCES) \
|
||||
$(MATH_SOURCES) \
|
||||
$(ARRAY_CACHE_SOURCES) \
|
||||
$(TNL_SOURCES) \
|
||||
$(SWRAST_SOURCES) \
|
||||
$(SWRAST_SETUP_SOURCES) \
|
||||
$(TNL_SOURCES) \
|
||||
$(ASM_C_SOURCES)
|
||||
|
||||
# This will probably get set to $(X86_SOURCES) in Make-config:
|
||||
ASM_SOURCES =
|
||||
|
||||
ifndef SOLO
|
||||
# This should get set in Make-config someday:
|
||||
DRIVER_SOURCES = \
|
||||
$(X11_DRIVER_SOURCES) \
|
||||
$(GLIDE_DRIVER_SOURCES) \
|
||||
$(SVGA_DRIVER_SOURCES)
|
||||
endif
|
||||
|
||||
|
||||
### Object files
|
||||
@@ -304,7 +306,7 @@ targets: $(LIBDIR)/$(GL_LIB) $(LIBDIR)/$(OSMESA_LIB) $(LIBMESA)
|
||||
$(LIBDIR)/$(GL_LIB): $(OBJECTS)
|
||||
$(TOP)/bin/mklib -o $(GL_LIB_NAME) -major $(GL_MAJOR) \
|
||||
-minor $(GL_MINOR) -patch $(GL_TINY) -install $(LIBDIR) \
|
||||
$(GL_LIB_DEPS) $(OBJECTS)
|
||||
$(MKLIB_OPTIONS) $(GL_LIB_DEPS) $(OBJECTS)
|
||||
|
||||
|
||||
# Make the OSMesa library
|
||||
@@ -313,7 +315,7 @@ $(LIBDIR)/$(OSMESA_LIB): $(OSMESA_OBJECTS)
|
||||
$(TOP)/bin/mklib -o $(OSMESA_LIB_NAME) -major $(MESA_MAJOR) \
|
||||
-minor $(MESA_MINOR) -patch $(GL_TINY) -L$(LIBDIR) \
|
||||
-l$(GL_LIB_NAME) -install $(LIBDIR) \
|
||||
$(OSMESA_OBJECTS) ; \
|
||||
$(MKLIB_OPTIONS) $(OSMESA_OBJECTS) ; \
|
||||
fi
|
||||
|
||||
|
||||
|
@@ -335,10 +335,10 @@ x86/gen_matypes.exe: x86/gen_matypes.c
|
||||
$(CC) -o $@ $(CFLAGS) -s $<
|
||||
|
||||
# [dBorca] Hack alert:
|
||||
# use standard API, to work around Win32 @x names
|
||||
# also glapi_x86.S is protected against __WIN32__
|
||||
main/dispatch.o: main/dispatch.c
|
||||
$(CC) -o $@ $(CFLAGS) -UUSE_X86_ASM -c $<
|
||||
# glapi_x86.S needs some adjustments
|
||||
# in order to generate correct entrypoints
|
||||
x86/glapi_x86.o: x86/glapi_x86.S
|
||||
$(CC) -o $@ $(CFLAGS) -U__WIN32__ -DSTDCALL_API -c $<
|
||||
|
||||
clean:
|
||||
-$(call UNLINK,array_cache/*.o)
|
||||
|
435
src/mesa/Makefile.wfx
Normal file
435
src/mesa/Makefile.wfx
Normal file
@@ -0,0 +1,435 @@
|
||||
# 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_GLIDE_NAPALM=1 -DH4=1 -DFX_GLIDE_H5_CSIM=1 -DGLIDE3=1 -DGLIDE3_ALPHA=1 -DBUILD_GL32 -DFX #-DGLX_DIRECT_RENDERING
|
||||
|
||||
!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 -G6 -c -D__MSC__ -D_MSC_VER=1200 -D_WIN32 -DWIN32 -DSTRICT -W3 #-WX -D__WIN32__
|
||||
LFLAGS = -nologo /DLL /OPT:WIN98 /MACHINE:IX86 /NODEFAULTLIB #/SUBSYSTEM:WINDOWS,4.00
|
||||
ARFLAGS = -nologo
|
||||
ASFLAGS = -O2 -fwin32
|
||||
|
||||
!if "$(DEBUG)"== "1"
|
||||
CFLAGS = $(CFLAGS) -Od -MDd -DDEBUG=1 -D_DEBUG -D_MT -Zi #-D_DLL conflicts with BUILD_GL32
|
||||
LFLAGS = $(LFLAGS) -debugtype:both /DEBUG
|
||||
ARFLAGS = $(ARFLAGS) -debugtype:both
|
||||
ASFLAGS = $(ASFLAGS) -g -DDEBUG=1
|
||||
!else
|
||||
CFLAGS = $(CFLAGS) -Ox -MD -D_MT
|
||||
!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\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
|
@@ -93,7 +93,7 @@ static void _ac_fallbacks_init( GLcontext *ctx )
|
||||
|
||||
cl = &ac->Fallback.Index;
|
||||
cl->Size = 1;
|
||||
cl->Type = GL_UNSIGNED_INT;
|
||||
cl->Type = GL_FLOAT;
|
||||
cl->Stride = 0;
|
||||
cl->StrideB = 0;
|
||||
cl->Ptr = (GLubyte *) &ctx->Current.Index;
|
||||
@@ -217,9 +217,9 @@ static void _ac_cache_init( GLcontext *ctx )
|
||||
|
||||
cl = &ac->Cache.Index;
|
||||
cl->Size = 1;
|
||||
cl->Type = GL_UNSIGNED_INT;
|
||||
cl->Type = GL_FLOAT;
|
||||
cl->Stride = 0;
|
||||
cl->StrideB = sizeof(GLuint);
|
||||
cl->StrideB = sizeof(GLfloat);
|
||||
cl->Ptr = (GLubyte *) MALLOC( cl->StrideB * size );
|
||||
cl->Enabled = 1;
|
||||
cl->Flags = 0;
|
||||
@@ -336,28 +336,28 @@ void _ac_DestroyContext( GLcontext *ctx )
|
||||
* not an offset into a buffer object.
|
||||
*/
|
||||
if (ac->Cache.Vertex.Ptr && ac->Cache.Vertex.BufferObj == nullObj)
|
||||
FREE( ac->Cache.Vertex.Ptr );
|
||||
FREE( (void *) ac->Cache.Vertex.Ptr );
|
||||
if (ac->Cache.Normal.Ptr && ac->Cache.Normal.BufferObj == nullObj)
|
||||
FREE( ac->Cache.Normal.Ptr );
|
||||
FREE( (void *) ac->Cache.Normal.Ptr );
|
||||
if (ac->Cache.Color.Ptr && ac->Cache.Color.BufferObj == nullObj)
|
||||
FREE( ac->Cache.Color.Ptr );
|
||||
FREE( (void *) ac->Cache.Color.Ptr );
|
||||
if (ac->Cache.SecondaryColor.Ptr && ac->Cache.SecondaryColor.BufferObj == nullObj)
|
||||
FREE( ac->Cache.SecondaryColor.Ptr );
|
||||
FREE( (void *) ac->Cache.SecondaryColor.Ptr );
|
||||
if (ac->Cache.EdgeFlag.Ptr && ac->Cache.EdgeFlag.BufferObj == nullObj)
|
||||
FREE( ac->Cache.EdgeFlag.Ptr );
|
||||
FREE( (void *) ac->Cache.EdgeFlag.Ptr );
|
||||
if (ac->Cache.Index.Ptr && ac->Cache.Index.BufferObj == nullObj)
|
||||
FREE( ac->Cache.Index.Ptr );
|
||||
FREE( (void *) ac->Cache.Index.Ptr );
|
||||
if (ac->Cache.FogCoord.Ptr && ac->Cache.FogCoord.BufferObj == nullObj)
|
||||
FREE( ac->Cache.FogCoord.Ptr );
|
||||
FREE( (void *) ac->Cache.FogCoord.Ptr );
|
||||
|
||||
for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
|
||||
if (ac->Cache.TexCoord[i].Ptr && ac->Cache.TexCoord[i].BufferObj == nullObj)
|
||||
FREE( ac->Cache.TexCoord[i].Ptr );
|
||||
FREE( (void *) ac->Cache.TexCoord[i].Ptr );
|
||||
}
|
||||
|
||||
for (i = 0; i < VERT_ATTRIB_MAX; i++) {
|
||||
if (ac->Cache.Attrib[i].Ptr && ac->Cache.Attrib[i].BufferObj == nullObj)
|
||||
FREE( ac->Cache.Attrib[i].Ptr );
|
||||
FREE( (void *) ac->Cache.Attrib[i].Ptr );
|
||||
}
|
||||
|
||||
if (ac->Elts)
|
||||
|
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.3 for Mesa
|
||||
* DOS/DJGPP device driver v1.4 for Mesa
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -31,7 +31,10 @@
|
||||
*/
|
||||
|
||||
|
||||
.file "blit.S"
|
||||
#include "x86/assyntax.h"
|
||||
|
||||
|
||||
FILE("blit.S")
|
||||
|
||||
/*
|
||||
* extern unsigned int vesa_gran_mask, vesa_gran_shift;
|
||||
@@ -41,8 +44,15 @@
|
||||
* extern int vl_current_stride, vl_current_height;
|
||||
* extern int vl_current_offset, vl_current_delta;
|
||||
*/
|
||||
EXTERN _vesa_gran_mask, _vesa_gran_shift
|
||||
EXTERN _vl_video_selector
|
||||
|
||||
.text
|
||||
EXTERN _vl_current_draw_buffer
|
||||
EXTERN _vl_current_stride, _vl_current_height
|
||||
EXTERN _vl_current_offset, _vl_current_delta
|
||||
|
||||
SEG_TEXT
|
||||
USE32
|
||||
|
||||
/* Desc: VESA bank switching routine (BIOS)
|
||||
*
|
||||
@@ -51,15 +61,15 @@
|
||||
*
|
||||
* Note: thrashes EAX
|
||||
*/
|
||||
.p2align 5,,31
|
||||
ALIGNTEXT32
|
||||
_vesa_swbankBIOS:
|
||||
movw $0x4f05, %ax
|
||||
int $0x10
|
||||
ret
|
||||
MOV_W (CONST(0x4f05), AX)
|
||||
INT (CONST(0x10))
|
||||
RET
|
||||
|
||||
.p2align 2,,3
|
||||
.global _vesa_swbank
|
||||
_vesa_swbank: .long _vesa_swbankBIOS
|
||||
ALIGNTEXT8
|
||||
GLOBL _vesa_swbank
|
||||
_vesa_swbank: D_LONG _vesa_swbankBIOS
|
||||
|
||||
/* Desc: void vesa_b_dump_virtual (void);
|
||||
*
|
||||
@@ -68,60 +78,60 @@ _vesa_swbank: .long _vesa_swbankBIOS
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _vesa_b_dump_virtual
|
||||
ALIGNTEXT32
|
||||
GLOBL _vesa_b_dump_virtual
|
||||
_vesa_b_dump_virtual:
|
||||
cld
|
||||
pushl %es
|
||||
pushl %ebx
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
pushl %ebp
|
||||
movl _vl_video_selector, %es
|
||||
movl _vl_current_draw_buffer, %esi
|
||||
movl _vl_current_offset, %edi
|
||||
movl _vesa_gran_shift, %ecx
|
||||
movl _vesa_gran_mask, %ebp
|
||||
movl %edi, %edx
|
||||
xorl %ebx, %ebx
|
||||
andl %ebp, %edi
|
||||
shrl %cl, %edx
|
||||
incl %ebp
|
||||
call *_vesa_swbank
|
||||
movl _vl_current_stride, %ecx
|
||||
movl _vl_current_height, %eax
|
||||
movl _vl_current_delta, %ebx
|
||||
shrl $2, %ecx
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
cmpl %ebp, %edi
|
||||
jb 2f
|
||||
pushl %eax
|
||||
pushl %ebx
|
||||
incl %edx
|
||||
xorl %ebx, %ebx
|
||||
call *_vesa_swbank
|
||||
popl %ebx
|
||||
popl %eax
|
||||
subl %ebp, %edi
|
||||
.balign 4
|
||||
2:
|
||||
movsl
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
popl %ecx
|
||||
addl %ebx, %edi
|
||||
decl %eax
|
||||
jnz 0b
|
||||
popl %ebp
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %ebx
|
||||
popl %es
|
||||
ret
|
||||
CLD
|
||||
PUSH_SR (ES)
|
||||
PUSH_L (EBX)
|
||||
PUSH_L (ESI)
|
||||
PUSH_L (EDI)
|
||||
PUSH_L (EBP)
|
||||
MOV_SR (CONTENT(_vl_video_selector), ES)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), ESI)
|
||||
MOV_L (CONTENT(_vl_current_offset), EDI)
|
||||
MOV_L (CONTENT(_vesa_gran_shift), ECX)
|
||||
MOV_L (CONTENT(_vesa_gran_mask), EBP)
|
||||
MOV_L (EDI, EDX)
|
||||
XOR_L (EBX, EBX)
|
||||
AND_L (EBP, EDI)
|
||||
SHR_L (CL, EDX)
|
||||
INC_L (EBP)
|
||||
CALL (VARINDIRECT(_vesa_swbank))
|
||||
MOV_L (CONTENT(_vl_current_stride), ECX)
|
||||
MOV_L (CONTENT(_vl_current_height), EAX)
|
||||
MOV_L (CONTENT(_vl_current_delta), EBX)
|
||||
SHR_L (CONST(2), ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
PUSH_L (ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(1):
|
||||
CMP_L (EBP, EDI)
|
||||
jb TLBL(2)
|
||||
PUSH_L (EAX)
|
||||
PUSH_L (EBX)
|
||||
INC_L (EDX)
|
||||
XOR_L (EBX, EBX)
|
||||
CALL (VARINDIRECT(_vesa_swbank))
|
||||
POP_L (EBX)
|
||||
POP_L (EAX)
|
||||
SUB_L (EBP, EDI)
|
||||
ALIGNTEXT4
|
||||
TLBL(2):
|
||||
MOVS_L
|
||||
DEC_L (ECX)
|
||||
jnz TLBL(1)
|
||||
POP_L (ECX)
|
||||
ADD_L (EBX, EDI)
|
||||
DEC_L (EAX)
|
||||
jnz TLBL(0)
|
||||
POP_L (EBP)
|
||||
POP_L (EDI)
|
||||
POP_L (ESI)
|
||||
POP_L (EBX)
|
||||
POP_SR (ES)
|
||||
RET
|
||||
|
||||
/* Desc: void vesa_l_dump_virtual (void);
|
||||
*
|
||||
@@ -130,32 +140,32 @@ _vesa_b_dump_virtual:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _vesa_l_dump_virtual
|
||||
ALIGNTEXT32
|
||||
GLOBL _vesa_l_dump_virtual
|
||||
_vesa_l_dump_virtual:
|
||||
cld
|
||||
pushl %es
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl _vl_video_selector, %es
|
||||
movl _vl_current_draw_buffer, %esi
|
||||
movl _vl_current_offset, %edi
|
||||
movl _vl_current_stride, %ecx
|
||||
movl _vl_current_height, %edx
|
||||
movl _vl_current_delta, %eax
|
||||
shrl $2, %ecx
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
rep; movsl
|
||||
popl %ecx
|
||||
addl %eax, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %edi
|
||||
popl %esi
|
||||
popl %es
|
||||
ret
|
||||
CLD
|
||||
PUSH_SR (ES)
|
||||
PUSH_L (ESI)
|
||||
PUSH_L (EDI)
|
||||
MOV_SR (CONTENT(_vl_video_selector), ES)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), ESI)
|
||||
MOV_L (CONTENT(_vl_current_offset), EDI)
|
||||
MOV_L (CONTENT(_vl_current_stride), ECX)
|
||||
MOV_L (CONTENT(_vl_current_height), EDX)
|
||||
MOV_L (CONTENT(_vl_current_delta), EAX)
|
||||
SHR_L (CONST(2), ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
PUSH_L (ECX)
|
||||
REP MOVS_L
|
||||
POP_L (ECX)
|
||||
ADD_L (EAX, EDI)
|
||||
DEC_L (EDX)
|
||||
jnz TLBL(0)
|
||||
POP_L (EDI)
|
||||
POP_L (ESI)
|
||||
POP_SR (ES)
|
||||
RET
|
||||
|
||||
/* Desc: void vesa_l_dump_virtual_mmx (void);
|
||||
*
|
||||
@@ -164,36 +174,37 @@ _vesa_l_dump_virtual:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _vesa_l_dump_virtual_mmx
|
||||
ALIGNTEXT32
|
||||
GLOBL _vesa_l_dump_virtual_mmx
|
||||
_vesa_l_dump_virtual_mmx:
|
||||
#ifdef USE_MMX_ASM
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl _vl_video_selector, %fs
|
||||
movl _vl_current_draw_buffer, %esi
|
||||
movl _vl_current_offset, %edi
|
||||
movl _vl_current_stride, %ecx
|
||||
movl _vl_current_height, %edx
|
||||
movl _vl_current_delta, %eax
|
||||
shrl $3, %ecx
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
movq (%esi), %mm0
|
||||
addl $8, %esi
|
||||
movq %mm0, %fs:(%edi)
|
||||
addl $8, %edi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
popl %ecx
|
||||
addl %eax, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %edi
|
||||
popl %esi
|
||||
emms
|
||||
PUSH_L (ESI)
|
||||
PUSH_L (EDI)
|
||||
MOV_SR (CONTENT(_vl_video_selector), FS)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), ESI)
|
||||
MOV_L (CONTENT(_vl_current_offset), EDI)
|
||||
MOV_L (CONTENT(_vl_current_stride), ECX)
|
||||
MOV_L (CONTENT(_vl_current_height), EDX)
|
||||
MOV_L (CONTENT(_vl_current_delta), EAX)
|
||||
SHR_L (CONST(3), ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
PUSH_L (ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(1):
|
||||
MOVQ (REGIND(ESI), MM0)
|
||||
ADD_L (CONST(8), ESI)
|
||||
SEGFS
|
||||
MOVQ (MM0, REGIND(EDI))
|
||||
ADD_L (CONST(8), EDI)
|
||||
DEC_L (ECX)
|
||||
jnz TLBL(1)
|
||||
POP_L (ECX)
|
||||
ADD_L (EAX, EDI)
|
||||
DEC_L (EDX)
|
||||
jnz TLBL(0)
|
||||
POP_L (EDI)
|
||||
POP_L (ESI)
|
||||
EMMS
|
||||
#endif
|
||||
ret
|
||||
RET
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 5.0.1
|
||||
* Version: 5.1
|
||||
*
|
||||
* Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "glheader.h"
|
||||
#include "context.h"
|
||||
#ifndef FX
|
||||
#include "bufferobj.h"
|
||||
#include "extensions.h"
|
||||
#include "macros.h"
|
||||
#include "matrix.h"
|
||||
@@ -1108,11 +1109,22 @@ static void clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* This function is called to specify which buffer to read and write
|
||||
* for software rasterization (swrast) fallbacks. This doesn't necessarily
|
||||
* correspond to glDrawBuffer() or glReadBuffer() calls.
|
||||
*/
|
||||
static void set_buffer (GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit)
|
||||
{
|
||||
/*
|
||||
* XXX todo - examine bufferBit and set read/write pointers
|
||||
*/
|
||||
/* Normally, we would have
|
||||
* ctx->Driver.ReadBuffer == set_read_buffer
|
||||
* ctx->Driver.DrawBuffer == set_draw_buffer
|
||||
* and make sure set_draw_buffer calls _swrast_DrawBuffer,
|
||||
* which in turn will call this routine via dd->SetBuffer.
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
@@ -1137,13 +1149,10 @@ static const GLubyte* get_string (GLcontext *ctx, GLenum name)
|
||||
switch (name) {
|
||||
case GL_RENDERER:
|
||||
return (const GLubyte *)"Mesa DJGPP"
|
||||
#ifdef FX
|
||||
" (FX)"
|
||||
#endif
|
||||
#ifdef MATROX
|
||||
" (MGA)"
|
||||
#endif
|
||||
"\0port (c) Borca Daniel aug-2003";
|
||||
"\0port (c) Borca Daniel oct-2003";
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
@@ -1311,7 +1320,7 @@ static void dmesa_init_pointers (GLcontext *ctx)
|
||||
|
||||
static void dmesa_update_state (GLcontext *ctx, GLuint new_state)
|
||||
{
|
||||
/* Propogate statechange information to swrast and swrast_setup
|
||||
/* Propagate statechange information to swrast and swrast_setup
|
||||
* modules. The DMesa driver has no internal GL-dependent state.
|
||||
*/
|
||||
_swrast_InvalidateState( ctx, new_state );
|
||||
|
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W triangle template
|
||||
* DOS/DJGPP device driver v1.4 for Mesa -- MGA2064W triangle template
|
||||
*
|
||||
* Copyright (c) 2003 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -83,7 +83,9 @@ void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v
|
||||
#endif
|
||||
|
||||
#if defined(INTERP_Z) || defined(INTERP_RGB)
|
||||
#if !LONG_LONG
|
||||
double one_area;
|
||||
#endif
|
||||
#ifndef INTERP_RGB
|
||||
int red = v3->color[0];
|
||||
int green = v3->color[1];
|
||||
@@ -147,7 +149,9 @@ void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v
|
||||
|
||||
/* draw lower triangle */
|
||||
#if defined(INTERP_Z) || defined(INTERP_RGB)
|
||||
#if !LONG_LONG
|
||||
one_area = (double)(1<<15) / (double)area;
|
||||
#endif
|
||||
mga_fifo(1);
|
||||
#else
|
||||
mga_fifo(2);
|
||||
@@ -163,8 +167,13 @@ void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v
|
||||
/* compute d?/dx and d?/dy derivatives */
|
||||
eMaj_dz = z3 - z1;
|
||||
eBot_dz = z2 - z1;
|
||||
#if !LONG_LONG
|
||||
dzdx = (eMaj_dz * eBot_dy - eMaj_dy * eBot_dz) * one_area;
|
||||
dzdy = (eMaj_dx * eBot_dz - eMaj_dz * eBot_dx) * one_area;
|
||||
#else
|
||||
dzdx = ((long long)(eMaj_dz * eBot_dy - eMaj_dy * eBot_dz)<<15) / area;
|
||||
dzdy = ((long long)(eMaj_dx * eBot_dz - eMaj_dz * eBot_dx)<<15) / area;
|
||||
#endif
|
||||
|
||||
#ifndef INTERP_RGB
|
||||
mga_fifo(11);
|
||||
@@ -196,12 +205,21 @@ void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v
|
||||
eBot_db = v2->color[2] - v1->color[2];
|
||||
|
||||
/* compute color increments */
|
||||
#if !LONG_LONG
|
||||
drdx = (eMaj_dr * eBot_dy - eMaj_dy * eBot_dr) * one_area;
|
||||
drdy = (eMaj_dx * eBot_dr - eMaj_dr * eBot_dx) * one_area;
|
||||
dgdx = (eMaj_dg * eBot_dy - eMaj_dy * eBot_dg) * one_area;
|
||||
dgdy = (eMaj_dx * eBot_dg - eMaj_dg * eBot_dx) * one_area;
|
||||
dbdx = (eMaj_db * eBot_dy - eMaj_dy * eBot_db) * one_area;
|
||||
dbdy = (eMaj_dx * eBot_db - eMaj_db * eBot_dx) * one_area;
|
||||
#else
|
||||
drdx = ((long long)(eMaj_dr * eBot_dy - eMaj_dy * eBot_dr)<<15) / area;
|
||||
drdy = ((long long)(eMaj_dx * eBot_dr - eMaj_dr * eBot_dx)<<15) / area;
|
||||
dgdx = ((long long)(eMaj_dg * eBot_dy - eMaj_dy * eBot_dg)<<15) / area;
|
||||
dgdy = ((long long)(eMaj_dx * eBot_dg - eMaj_dg * eBot_dx)<<15) / area;
|
||||
dbdx = ((long long)(eMaj_db * eBot_dy - eMaj_dy * eBot_db)<<15) / area;
|
||||
dbdy = ((long long)(eMaj_dx * eBot_db - eMaj_db * eBot_dx)<<15) / area;
|
||||
#endif
|
||||
|
||||
mga_fifo(6);
|
||||
mga_outl(M_DR6, drdx);
|
||||
|
@@ -1,375 +0,0 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 5.0
|
||||
*
|
||||
* Copyright (C) 1999-2002 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W triangle template
|
||||
*
|
||||
* Copyright (c) 2003 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
* Web : http://www.geocities.com/dborca
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Triangle Rasterizer Template
|
||||
*
|
||||
* This file is #include'd to generate custom triangle rasterizers.
|
||||
*
|
||||
* The following macros may be defined to indicate what auxillary information
|
||||
* must be interplated across the triangle:
|
||||
* INTERP_Z - if defined, interpolate Z values
|
||||
* INTERP_RGB - if defined, interpolate RGB values
|
||||
*
|
||||
* TAG - function name
|
||||
* CULL - enable culling for: 0=no, 1=back, -1=front
|
||||
*
|
||||
* SETUP_CODE - to be executed once per triangle (usually HW init)
|
||||
*
|
||||
* For flatshaded primitives, the provoking vertex is the final one.
|
||||
* This code was designed for the origin to be in the upper-left corner.
|
||||
*
|
||||
* Inspired by triangle rasterizer code written by Brian Paul.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#define TRI_SWAP(a, b) \
|
||||
do { \
|
||||
const MGAvertex *tmp = a; \
|
||||
a = b; \
|
||||
b = tmp; \
|
||||
} while (0)
|
||||
|
||||
void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3)
|
||||
{
|
||||
int area;
|
||||
int x1, y1, x2, y2, x3, y3;
|
||||
int eMaj_dx, eMaj_dy, eBot_dx, eBot_dy, eTop_dx, eTop_dy;
|
||||
#ifdef INTERP_RGB
|
||||
#define FIFO_CNT_RGB 3
|
||||
int eMaj_dr, eBot_dr, eMaj_dg, eBot_dg, eMaj_db, eBot_db;
|
||||
int drdx, drdy, dgdx, dgdy, dbdx, dbdy;
|
||||
#else
|
||||
#define FIFO_CNT_RGB 0
|
||||
#endif
|
||||
#ifdef INTERP_Z
|
||||
#define FIFO_CNT_Z 1
|
||||
int dzdx, dzdy;
|
||||
int eMaj_dz, eBot_dz;
|
||||
int z1, z2, z3;
|
||||
#else
|
||||
#define FIFO_CNT_Z 0
|
||||
#endif
|
||||
|
||||
#if defined(INTERP_Z) || defined(INTERP_RGB)
|
||||
#ifndef INTERP_RGB
|
||||
int red = v3->color[0];
|
||||
int green = v3->color[1];
|
||||
int blue = v3->color[2];
|
||||
#endif
|
||||
#else
|
||||
unsigned long color = mga_mixrgb_full(v3->color);
|
||||
#endif
|
||||
|
||||
int sgn = 0;
|
||||
|
||||
/* sort along the vertical axis */
|
||||
if (v2->win[1] < v1->win[1]) {
|
||||
TRI_SWAP(v1, v2);
|
||||
#ifdef CULL
|
||||
cull = -cull;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (v3->win[1] < v1->win[1]) {
|
||||
TRI_SWAP(v1, v3);
|
||||
TRI_SWAP(v2, v3);
|
||||
} else if (v3->win[1] < v2->win[1]) {
|
||||
TRI_SWAP(v2, v3);
|
||||
#ifdef CULL
|
||||
cull = -cull;
|
||||
#endif
|
||||
}
|
||||
|
||||
x1 = v1->win[0];
|
||||
y1 = v1->win[1];
|
||||
x2 = v2->win[0];
|
||||
y2 = v2->win[1];
|
||||
x3 = v3->win[0];
|
||||
y3 = v3->win[1];
|
||||
|
||||
/* compute deltas for each edge */
|
||||
eMaj_dx = x3 - x1;
|
||||
eMaj_dy = y3 - y1;
|
||||
eBot_dx = x2 - x1;
|
||||
eBot_dy = y2 - y1;
|
||||
eTop_dx = x3 - x2;
|
||||
eTop_dy = y3 - y2;
|
||||
|
||||
/* compute area */
|
||||
if ((area = eMaj_dx * eBot_dy - eBot_dx * eMaj_dy) == 0) {
|
||||
return;
|
||||
}
|
||||
#ifdef CULL
|
||||
if ((area * cull) > 0) {
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
mga_select();
|
||||
|
||||
/* set engine state */
|
||||
#ifdef SETUP_CODE
|
||||
SETUP_CODE
|
||||
#endif
|
||||
|
||||
/* draw lower triangle */
|
||||
#if defined(INTERP_Z) || defined(INTERP_RGB)
|
||||
mga_fifo(1);
|
||||
#else
|
||||
mga_fifo(2);
|
||||
mga_outl(M_FCOL, color);
|
||||
#endif
|
||||
mga_outl(M_YDST, y1);
|
||||
|
||||
#ifdef INTERP_Z
|
||||
z1 = v1->win[2];
|
||||
z2 = v2->win[2];
|
||||
z3 = v3->win[2];
|
||||
|
||||
/* compute d?/dx and d?/dy derivatives */
|
||||
eMaj_dz = z3 - z1;
|
||||
eBot_dz = z2 - z1;
|
||||
dzdx = ((long long)(eMaj_dz * eBot_dy - eMaj_dy * eBot_dz)<<15) / area;
|
||||
dzdy = ((long long)(eMaj_dx * eBot_dz - eMaj_dz * eBot_dx)<<15) / area;
|
||||
|
||||
#ifndef INTERP_RGB
|
||||
mga_fifo(11);
|
||||
mga_outl(M_DR2, dzdx);
|
||||
mga_outl(M_DR3, dzdy);
|
||||
mga_outl(M_DR4, red<<15);
|
||||
mga_outl(M_DR6, 0);
|
||||
mga_outl(M_DR7, 0);
|
||||
mga_outl(M_DR8, green<<15);
|
||||
mga_outl(M_DR10, 0);
|
||||
mga_outl(M_DR11, 0);
|
||||
mga_outl(M_DR12, blue<<15);
|
||||
mga_outl(M_DR14, 0);
|
||||
mga_outl(M_DR15, 0);
|
||||
#else
|
||||
mga_fifo(2);
|
||||
mga_outl(M_DR2, dzdx);
|
||||
mga_outl(M_DR3, dzdy);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef INTERP_RGB
|
||||
/* compute color deltas */
|
||||
eMaj_dr = v3->color[0] - v1->color[0];
|
||||
eBot_dr = v2->color[0] - v1->color[0];
|
||||
eMaj_dg = v3->color[1] - v1->color[1];
|
||||
eBot_dg = v2->color[1] - v1->color[1];
|
||||
eMaj_db = v3->color[2] - v1->color[2];
|
||||
eBot_db = v2->color[2] - v1->color[2];
|
||||
|
||||
/* compute color increments */
|
||||
drdx = ((long long)(eMaj_dr * eBot_dy - eMaj_dy * eBot_dr)<<15) / area;
|
||||
drdy = ((long long)(eMaj_dx * eBot_dr - eMaj_dr * eBot_dx)<<15) / area;
|
||||
dgdx = ((long long)(eMaj_dg * eBot_dy - eMaj_dy * eBot_dg)<<15) / area;
|
||||
dgdy = ((long long)(eMaj_dx * eBot_dg - eMaj_dg * eBot_dx)<<15) / area;
|
||||
dbdx = ((long long)(eMaj_db * eBot_dy - eMaj_dy * eBot_db)<<15) / area;
|
||||
dbdy = ((long long)(eMaj_dx * eBot_db - eMaj_db * eBot_dx)<<15) / area;
|
||||
|
||||
mga_fifo(6);
|
||||
mga_outl(M_DR6, drdx);
|
||||
mga_outl(M_DR7, drdy);
|
||||
mga_outl(M_DR10, dgdx);
|
||||
mga_outl(M_DR11, dgdy);
|
||||
mga_outl(M_DR14, dbdx);
|
||||
mga_outl(M_DR15, dbdy);
|
||||
#endif
|
||||
|
||||
if (area > 0) { /* major edge on the right */
|
||||
if (eBot_dy) { /* have lower triangle */
|
||||
mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB);
|
||||
|
||||
mga_outl(M_AR0, eBot_dy);
|
||||
if (x2 < x1) {
|
||||
mga_outl(M_AR1, eBot_dx + eBot_dy - 1);
|
||||
mga_outl(M_AR2, eBot_dx);
|
||||
sgn |= M_SDXL;
|
||||
} else {
|
||||
mga_outl(M_AR1, -eBot_dx);
|
||||
mga_outl(M_AR2, -eBot_dx);
|
||||
}
|
||||
|
||||
mga_outl(M_AR6, eMaj_dy);
|
||||
if (x3 < x1) {
|
||||
mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1);
|
||||
mga_outl(M_AR5, eMaj_dx);
|
||||
sgn |= M_SDXR;
|
||||
} else {
|
||||
mga_outl(M_AR4, -eMaj_dx);
|
||||
mga_outl(M_AR5, -eMaj_dx);
|
||||
}
|
||||
|
||||
mga_outl(M_FXBNDRY, (x1<<16) | x1);
|
||||
#ifdef INTERP_Z
|
||||
mga_outl(M_DR0, z1<<15);
|
||||
#endif
|
||||
#ifdef INTERP_RGB
|
||||
mga_outl(M_DR4, v1->color[0]<<15);
|
||||
mga_outl(M_DR8, v1->color[1]<<15);
|
||||
mga_outl(M_DR12, v1->color[2]<<15);
|
||||
#endif
|
||||
mga_outl(M_SGN, sgn);
|
||||
mga_outl(M_LEN | M_EXEC, eBot_dy);
|
||||
} else { /* no lower triangle */
|
||||
mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB);
|
||||
|
||||
mga_outl(M_AR6, eMaj_dy);
|
||||
if (x3 < x1) {
|
||||
mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1);
|
||||
mga_outl(M_AR5, eMaj_dx);
|
||||
sgn |= M_SDXR;
|
||||
} else {
|
||||
mga_outl(M_AR4, -eMaj_dx);
|
||||
mga_outl(M_AR5, -eMaj_dx);
|
||||
}
|
||||
|
||||
mga_outl(M_FXBNDRY, (x1<<16) | x2);
|
||||
#ifdef INTERP_Z
|
||||
mga_outl(M_DR0, z2<<15);
|
||||
#endif
|
||||
#ifdef INTERP_RGB
|
||||
mga_outl(M_DR4, v2->color[0]<<15);
|
||||
mga_outl(M_DR8, v2->color[1]<<15);
|
||||
mga_outl(M_DR12, v2->color[2]<<15);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* draw upper triangle */
|
||||
if (eTop_dy) {
|
||||
mga_fifo(5);
|
||||
mga_outl(M_AR0, eTop_dy);
|
||||
if (x3 < x2) {
|
||||
mga_outl(M_AR1, eTop_dx + eTop_dy - 1);
|
||||
mga_outl(M_AR2, eTop_dx);
|
||||
sgn |= M_SDXL;
|
||||
} else {
|
||||
mga_outl(M_AR1, -eTop_dx);
|
||||
mga_outl(M_AR2, -eTop_dx);
|
||||
sgn &= ~M_SDXL;
|
||||
}
|
||||
mga_outl(M_SGN, sgn);
|
||||
mga_outl(M_LEN | M_EXEC, eTop_dy);
|
||||
}
|
||||
} else { /* major edge on the left */
|
||||
if (eBot_dy) { /* have lower triangle */
|
||||
mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB);
|
||||
|
||||
mga_outl(M_AR0, eMaj_dy);
|
||||
if (x3 < x1) {
|
||||
mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1);
|
||||
mga_outl(M_AR2, eMaj_dx);
|
||||
sgn |= M_SDXL;
|
||||
} else {
|
||||
mga_outl(M_AR1, -eMaj_dx);
|
||||
mga_outl(M_AR2, -eMaj_dx);
|
||||
}
|
||||
|
||||
mga_outl(M_AR6, eBot_dy);
|
||||
if (x2 < x1) {
|
||||
mga_outl(M_AR4, eBot_dx + eBot_dy - 1);
|
||||
mga_outl(M_AR5, eBot_dx);
|
||||
sgn |= M_SDXR;
|
||||
} else {
|
||||
mga_outl(M_AR4, -eBot_dx);
|
||||
mga_outl(M_AR5, -eBot_dx);
|
||||
}
|
||||
|
||||
mga_outl(M_FXBNDRY, (x1<<16) | x1);
|
||||
#ifdef INTERP_Z
|
||||
mga_outl(M_DR0, z1<<15);
|
||||
#endif
|
||||
#ifdef INTERP_RGB
|
||||
mga_outl(M_DR4, v1->color[0]<<15);
|
||||
mga_outl(M_DR8, v1->color[1]<<15);
|
||||
mga_outl(M_DR12, v1->color[2]<<15);
|
||||
#endif
|
||||
mga_outl(M_SGN, sgn);
|
||||
mga_outl(M_LEN | M_EXEC, eBot_dy);
|
||||
} else { /* no lower triangle */
|
||||
mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB);
|
||||
|
||||
mga_outl(M_AR0, eMaj_dy);
|
||||
if (x3 < x1) {
|
||||
mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1);
|
||||
mga_outl(M_AR2, eMaj_dx);
|
||||
sgn |= M_SDXL;
|
||||
} else {
|
||||
mga_outl(M_AR1, -eMaj_dx);
|
||||
mga_outl(M_AR2, -eMaj_dx);
|
||||
}
|
||||
|
||||
mga_outl(M_FXBNDRY, (x2<<16) | x1);
|
||||
#ifdef INTERP_Z
|
||||
mga_outl(M_DR0, z1<<15);
|
||||
#endif
|
||||
#ifdef INTERP_RGB
|
||||
mga_outl(M_DR4, v1->color[0]<<15);
|
||||
mga_outl(M_DR8, v1->color[1]<<15);
|
||||
mga_outl(M_DR12, v1->color[2]<<15);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* draw upper triangle */
|
||||
if (eTop_dy) {
|
||||
mga_fifo(5);
|
||||
mga_outl(M_AR6, eTop_dy);
|
||||
if (x3 < x2) {
|
||||
mga_outl(M_AR4, eTop_dx + eTop_dy - 1);
|
||||
mga_outl(M_AR5, eTop_dx);
|
||||
sgn |= M_SDXR;
|
||||
} else {
|
||||
mga_outl(M_AR4, -eTop_dx);
|
||||
mga_outl(M_AR5, -eTop_dx);
|
||||
sgn &= ~M_SDXR;
|
||||
}
|
||||
mga_outl(M_SGN, sgn);
|
||||
mga_outl(M_LEN | M_EXEC, eTop_dy);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#undef FIFO_CNT_RGB
|
||||
#undef FIFO_CNT_Z
|
||||
|
||||
#undef TRI_SWAP
|
||||
|
||||
#undef SETUP_CODE
|
||||
#undef INTERP_RGB
|
||||
#undef INTERP_Z
|
||||
#undef CULL
|
||||
#undef TAG
|
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* DOS/DJGPP device driver v1.3 for Mesa
|
||||
* DOS/DJGPP device driver v1.4 for Mesa
|
||||
*
|
||||
* Copyright (C) 2002 - Borca Daniel
|
||||
* Email : dborca@yahoo.com
|
||||
@@ -31,14 +31,20 @@
|
||||
*/
|
||||
|
||||
|
||||
.file "virtual.S"
|
||||
#include "x86/assyntax.h"
|
||||
|
||||
|
||||
FILE("virtual.S")
|
||||
|
||||
/*
|
||||
* extern void *vl_current_draw_buffer;
|
||||
* extern int vl_current_width, vl_current_bytes;
|
||||
*/
|
||||
EXTERN _vl_current_draw_buffer
|
||||
EXTERN _vl_current_width, _vl_current_bytes
|
||||
|
||||
.text
|
||||
SEG_TEXT
|
||||
USE32
|
||||
|
||||
/* Desc: void v_clear8 (int color);
|
||||
*
|
||||
@@ -47,14 +53,14 @@
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear8
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_clear8
|
||||
_v_clear8:
|
||||
movl 4(%esp), %eax
|
||||
movb %al, %ah
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
popl %eax
|
||||
MOV_L (REGOFF(4, ESP), EAX)
|
||||
MOV_B (AL, AH)
|
||||
PUSH_W (AX)
|
||||
PUSH_W (AX)
|
||||
POP_L (EAX)
|
||||
jmp _v_clear_common
|
||||
|
||||
/* Desc: void v_clear16 (int color);
|
||||
@@ -64,13 +70,13 @@ _v_clear8:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear16
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_clear16
|
||||
_v_clear16:
|
||||
movl 4(%esp), %eax
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
popl %eax
|
||||
MOV_L (REGOFF(4, ESP), EAX)
|
||||
PUSH_W (AX)
|
||||
PUSH_W (AX)
|
||||
POP_L (EAX)
|
||||
jmp _v_clear_common
|
||||
|
||||
/* Desc: void v_clear32 (int color);
|
||||
@@ -80,22 +86,22 @@ _v_clear16:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear32
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_clear32
|
||||
_v_clear32:
|
||||
movl 4(%esp), %eax
|
||||
.balign 4
|
||||
MOV_L (REGOFF(4, ESP), EAX)
|
||||
ALIGNTEXT4
|
||||
_v_clear_common:
|
||||
movl _vl_current_bytes, %ecx
|
||||
movl _vl_current_draw_buffer, %edx
|
||||
shrl $2, %ecx
|
||||
.balign 4
|
||||
0:
|
||||
movl %eax, (%edx)
|
||||
addl $4, %edx
|
||||
decl %ecx
|
||||
jnz 0b
|
||||
ret
|
||||
MOV_L (CONTENT(_vl_current_bytes), ECX)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), EDX)
|
||||
SHR_L (CONST(2), ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
MOV_L (EAX, REGIND(EDX))
|
||||
ADD_L (CONST(4), EDX)
|
||||
DEC_L (ECX)
|
||||
jnz TLBL(0)
|
||||
RET
|
||||
|
||||
/* Desc: void v_clear8_mmx (int color);
|
||||
*
|
||||
@@ -104,13 +110,13 @@ _v_clear_common:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear8_mmx
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_clear8_mmx
|
||||
_v_clear8_mmx:
|
||||
#ifdef USE_MMX_ASM
|
||||
movd 4(%esp), %mm0
|
||||
punpcklbw %mm0, %mm0
|
||||
punpcklwd %mm0, %mm0
|
||||
MOVD (REGOFF(4, ESP), MM0)
|
||||
PUNPCKLBW (MM0, MM0)
|
||||
PUNPCKLWD (MM0, MM0)
|
||||
jmp _v_clear_common_mmx
|
||||
#endif
|
||||
|
||||
@@ -121,12 +127,12 @@ _v_clear8_mmx:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear16_mmx
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_clear16_mmx
|
||||
_v_clear16_mmx:
|
||||
#ifdef USE_MMX_ASM
|
||||
movd 4(%esp), %mm0
|
||||
punpcklwd %mm0, %mm0
|
||||
MOVD (REGOFF(4, ESP), MM0)
|
||||
PUNPCKLWD (MM0, MM0)
|
||||
jmp _v_clear_common_mmx
|
||||
#endif
|
||||
|
||||
@@ -137,26 +143,26 @@ _v_clear16_mmx:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear32_mmx
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_clear32_mmx
|
||||
_v_clear32_mmx:
|
||||
#ifdef USE_MMX_ASM
|
||||
movd 4(%esp), %mm0
|
||||
.balign 4
|
||||
MOVD (REGOFF(4, ESP), MM0)
|
||||
ALIGNTEXT4
|
||||
_v_clear_common_mmx:
|
||||
punpckldq %mm0, %mm0
|
||||
movl _vl_current_bytes, %ecx
|
||||
movl _vl_current_draw_buffer, %edx
|
||||
shrl $3, %ecx
|
||||
.balign 4
|
||||
0:
|
||||
movq %mm0, (%edx)
|
||||
addl $8, %edx
|
||||
decl %ecx
|
||||
jnz 0b
|
||||
emms
|
||||
PUNPCKLDQ (MM0, MM0)
|
||||
MOV_L (CONTENT(_vl_current_bytes), ECX)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), EDX)
|
||||
SHR_L (CONST(3), ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
MOVQ (MM0, REGIND(EDX))
|
||||
ADD_L (CONST(8), EDX)
|
||||
DEC_L (ECX)
|
||||
jnz TLBL(0)
|
||||
EMMS
|
||||
#endif
|
||||
ret
|
||||
RET
|
||||
|
||||
/* Desc: void v_clear24 (int color);
|
||||
*
|
||||
@@ -165,26 +171,26 @@ _v_clear_common_mmx:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear24
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_clear24
|
||||
_v_clear24:
|
||||
movl $0xaaaaaaab, %eax
|
||||
mull _vl_current_bytes
|
||||
movl 4(%esp), %eax
|
||||
movl %edx, %ecx
|
||||
pushl %ebx
|
||||
movl _vl_current_draw_buffer, %edx
|
||||
shrl %ecx
|
||||
movb 10(%esp), %bl
|
||||
.balign 4
|
||||
0:
|
||||
movw %ax, (%edx)
|
||||
movb %bl, 2(%edx)
|
||||
addl $3, %edx
|
||||
decl %ecx
|
||||
jnz 0b
|
||||
popl %ebx
|
||||
ret
|
||||
MOV_L (CONST(0xaaaaaaab), EAX)
|
||||
MUL_L (CONTENT(_vl_current_bytes))
|
||||
MOV_L (REGOFF(4, ESP), EAX)
|
||||
MOV_L (EDX, ECX)
|
||||
PUSH_L (EBX)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), EDX)
|
||||
SHR_L (CONST(1), ECX)
|
||||
MOV_B (REGOFF(10,ESP), BL)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
MOV_W (AX, REGIND(EDX))
|
||||
MOV_B (BL, REGOFF(2,EDX))
|
||||
ADD_L (CONST(3), EDX)
|
||||
DEC_L (ECX)
|
||||
jnz TLBL(0)
|
||||
POP_L (EBX)
|
||||
RET
|
||||
|
||||
/* Desc: void v_clear24_mmx (int color);
|
||||
*
|
||||
@@ -193,47 +199,47 @@ _v_clear24:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_clear24_mmx
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_clear24_mmx
|
||||
_v_clear24_mmx:
|
||||
#ifdef USE_MMX_ASM
|
||||
movl 4(%esp), %eax
|
||||
movl %eax, %edx
|
||||
movl %eax, %ecx
|
||||
shll $16, %edx
|
||||
rorl $8, %ecx
|
||||
movw %cx, %dx
|
||||
rorl $16, %ecx
|
||||
movb %dh, %cl
|
||||
shll $8, %eax
|
||||
movb %ch, %al
|
||||
rorl $8, %eax
|
||||
MOV_L (REGOFF(4, ESP), EAX)
|
||||
MOV_L (EAX, EDX)
|
||||
MOV_L (EAX, ECX)
|
||||
SHL_L (CONST(16), EDX)
|
||||
ROR_L (CONST(8), ECX)
|
||||
MOV_W (CX, DX)
|
||||
ROR_L (CONST(16), ECX)
|
||||
MOV_B (DH, CL)
|
||||
SHL_L (CONST(8), EAX)
|
||||
MOV_B (CH, AL)
|
||||
ROR_L (CONST(8), EAX)
|
||||
|
||||
pushl %edx
|
||||
pushl %eax
|
||||
movq (%esp), %mm0
|
||||
pushl %ecx
|
||||
movq (%esp), %mm1
|
||||
pushl %edx
|
||||
movq (%esp), %mm2
|
||||
PUSH_L (EDX)
|
||||
PUSH_L (EAX)
|
||||
MOVQ (REGIND(ESP), MM0)
|
||||
PUSH_L (ECX)
|
||||
MOVQ (REGIND(ESP), MM1)
|
||||
PUSH_L (EDX)
|
||||
MOVQ (REGIND(ESP), MM2)
|
||||
|
||||
movl $0xaaaaaaab, %eax
|
||||
mull _vl_current_bytes
|
||||
movl %edx, %ecx
|
||||
movl _vl_current_draw_buffer, %edx
|
||||
shrl $4, %ecx
|
||||
.balign 4
|
||||
0:
|
||||
movq %mm0, (%edx)
|
||||
movq %mm1, 8(%edx)
|
||||
movq %mm2, 16(%edx)
|
||||
addl $24, %edx
|
||||
decl %ecx
|
||||
jnz 0b
|
||||
emms
|
||||
addl $16, %esp
|
||||
MOV_L (CONST(0xaaaaaaab), EAX)
|
||||
MUL_L (CONTENT(_vl_current_bytes))
|
||||
MOV_L (EDX, ECX)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), EDX)
|
||||
SHR_L (CONST(4), ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
MOVQ (MM0, REGIND(EDX))
|
||||
MOVQ (MM1, REGOFF(8,EDX))
|
||||
MOVQ (MM2, REGOFF(16,EDX))
|
||||
ADD_L (CONST(24), EDX)
|
||||
DEC_L (ECX)
|
||||
jnz TLBL(0)
|
||||
EMMS
|
||||
ADD_L (CONST(16), ESP)
|
||||
#endif
|
||||
ret
|
||||
RET
|
||||
|
||||
/* Desc: void v_rect8 (int color);
|
||||
*
|
||||
@@ -242,51 +248,51 @@ _v_clear24_mmx:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_rect8
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_rect8
|
||||
_v_rect8:
|
||||
cld
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl 28(%esp), %eax
|
||||
movl _vl_current_width, %esi
|
||||
movl 16(%esp), %edi
|
||||
movb %al, %ah
|
||||
movl 20(%esp), %ecx
|
||||
imull %esi, %edi
|
||||
movl 24(%esp), %edx
|
||||
subl %ecx, %esi
|
||||
addl 12(%esp), %edi
|
||||
pushw %ax
|
||||
pushw %ax
|
||||
pushl %ds
|
||||
popl %es
|
||||
addl _vl_current_draw_buffer, %edi
|
||||
popl %eax
|
||||
pushl %ebx
|
||||
movl %ecx, %ebx
|
||||
andl $3, %ebx
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
shrl $2, %ecx
|
||||
rep; stosl
|
||||
testl %ebx, %ebx
|
||||
jz 2f
|
||||
movl %ebx, %ecx
|
||||
rep; stosb
|
||||
.balign 4
|
||||
2:
|
||||
popl %ecx
|
||||
addl %esi, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %ebx
|
||||
popl %edi
|
||||
popl %esi
|
||||
ret
|
||||
CLD
|
||||
PUSH_L (ESI)
|
||||
PUSH_L (EDI)
|
||||
MOV_L (REGOFF(28, ESP), EAX)
|
||||
MOV_L (CONTENT(_vl_current_width), ESI)
|
||||
MOV_L (REGOFF(16, ESP), EDI)
|
||||
MOV_B (AL, AH)
|
||||
MOV_L (REGOFF(20, ESP), ECX)
|
||||
IMUL_L (ESI, EDI)
|
||||
MOV_L (REGOFF(24, ESP), EDX)
|
||||
SUB_L (ECX, ESI)
|
||||
ADD_L (REGOFF(12, ESP), EDI)
|
||||
PUSH_W (AX)
|
||||
PUSH_W (AX)
|
||||
PUSH_SR (DS)
|
||||
POP_SR (ES)
|
||||
ADD_L (CONTENT(_vl_current_draw_buffer), EDI)
|
||||
POP_L (EAX)
|
||||
PUSH_L (EBX)
|
||||
MOV_L (ECX, EBX)
|
||||
AND_L (CONST(3), EBX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
PUSH_L (ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(1):
|
||||
SHR_L (CONST(2), ECX)
|
||||
REP STOS_L
|
||||
TEST_L (EBX, EBX)
|
||||
jz TLBL(2)
|
||||
MOV_L (EBX, ECX)
|
||||
REP STOS_B
|
||||
ALIGNTEXT4
|
||||
TLBL(2):
|
||||
POP_L (ECX)
|
||||
ADD_L (ESI, EDI)
|
||||
DEC_L (EDX)
|
||||
jnz TLBL(0)
|
||||
POP_L (EBX)
|
||||
POP_L (EDI)
|
||||
POP_L (ESI)
|
||||
RET
|
||||
|
||||
/* Desc: void v_rect16 (int color);
|
||||
*
|
||||
@@ -295,46 +301,46 @@ _v_rect8:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_rect16
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_rect16
|
||||
_v_rect16:
|
||||
cld
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl 28(%esp), %eax
|
||||
movl _vl_current_width, %esi
|
||||
movl 16(%esp), %edi
|
||||
movl 20(%esp), %ecx
|
||||
imull %esi, %edi
|
||||
movl 24(%esp), %edx
|
||||
subl %ecx, %esi
|
||||
addl 12(%esp), %edi
|
||||
pushw %ax
|
||||
shll %esi
|
||||
pushw %ax
|
||||
shll %edi
|
||||
pushl %ds
|
||||
popl %es
|
||||
addl _vl_current_draw_buffer, %edi
|
||||
popl %eax
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
shrl %ecx
|
||||
rep; stosl
|
||||
jnc 2f
|
||||
stosw
|
||||
.balign 4
|
||||
2:
|
||||
popl %ecx
|
||||
addl %esi, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %edi
|
||||
popl %esi
|
||||
ret
|
||||
CLD
|
||||
PUSH_L (ESI)
|
||||
PUSH_L (EDI)
|
||||
MOV_L (REGOFF(28, ESP), EAX)
|
||||
MOV_L (CONTENT(_vl_current_width), ESI)
|
||||
MOV_L (REGOFF(16, ESP), EDI)
|
||||
MOV_L (REGOFF(20, ESP), ECX)
|
||||
IMUL_L (ESI, EDI)
|
||||
MOV_L (REGOFF(24, ESP), EDX)
|
||||
SUB_L (ECX, ESI)
|
||||
ADD_L (REGOFF(12, ESP), EDI)
|
||||
PUSH_W (AX)
|
||||
SHL_L (CONST(1), ESI)
|
||||
PUSH_W (AX)
|
||||
SHL_L (CONST(1), EDI)
|
||||
PUSH_SR (DS)
|
||||
POP_SR (ES)
|
||||
ADD_L (CONTENT(_vl_current_draw_buffer), EDI)
|
||||
POP_L (EAX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
PUSH_L (ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(1):
|
||||
SHR_L (CONST(1), ECX)
|
||||
REP STOS_L
|
||||
jnc TLBL(2)
|
||||
STOS_W
|
||||
ALIGNTEXT4
|
||||
TLBL(2):
|
||||
POP_L (ECX)
|
||||
ADD_L (ESI, EDI)
|
||||
DEC_L (EDX)
|
||||
jnz TLBL(0)
|
||||
POP_L (EDI)
|
||||
POP_L (ESI)
|
||||
RET
|
||||
|
||||
/* Desc: void v_rect24 (int color);
|
||||
*
|
||||
@@ -343,43 +349,43 @@ _v_rect16:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_rect24
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_rect24
|
||||
_v_rect24:
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl 28(%esp), %eax
|
||||
movl _vl_current_width, %esi
|
||||
movl 16(%esp), %edi
|
||||
movl 20(%esp), %ecx
|
||||
imull %esi, %edi
|
||||
movl 24(%esp), %edx
|
||||
subl %ecx, %esi
|
||||
addl 12(%esp), %edi
|
||||
leal (%esi, %esi, 2), %esi
|
||||
pushl %ebx
|
||||
leal (%edi, %edi, 2), %edi
|
||||
movl %eax, %ebx
|
||||
addl _vl_current_draw_buffer, %edi
|
||||
shrl $16, %ebx
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
movw %ax, (%edi)
|
||||
movb %bl, 2(%edi)
|
||||
addl $3, %edi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
popl %ecx
|
||||
addl %esi, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %ebx
|
||||
popl %edi
|
||||
popl %esi
|
||||
ret
|
||||
PUSH_L (ESI)
|
||||
PUSH_L (EDI)
|
||||
MOV_L (REGOFF(28, ESP), EAX)
|
||||
MOV_L (CONTENT(_vl_current_width), ESI)
|
||||
MOV_L (REGOFF(16, ESP), EDI)
|
||||
MOV_L (REGOFF(20, ESP), ECX)
|
||||
IMUL_L (ESI, EDI)
|
||||
MOV_L (REGOFF(24, ESP), EDX)
|
||||
SUB_L (ECX, ESI)
|
||||
ADD_L (REGOFF(12, ESP), EDI)
|
||||
LEA_L (REGBIS(ESI, ESI, 2), ESI)
|
||||
PUSH_L (EBX)
|
||||
LEA_L (REGBIS(EDI, EDI, 2), EDI)
|
||||
MOV_L (EAX, EBX)
|
||||
ADD_L (CONTENT(_vl_current_draw_buffer), EDI)
|
||||
SHR_L (CONST(16), EBX)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
PUSH_L (ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(1):
|
||||
MOV_W (AX, REGIND(EDI))
|
||||
MOV_B (BL, REGOFF(2,EDI))
|
||||
ADD_L (CONST(3), EDI)
|
||||
DEC_L (ECX)
|
||||
jnz TLBL(1)
|
||||
POP_L (ECX)
|
||||
ADD_L (ESI, EDI)
|
||||
DEC_L (EDX)
|
||||
jnz TLBL(0)
|
||||
POP_L (EBX)
|
||||
POP_L (EDI)
|
||||
POP_L (ESI)
|
||||
RET
|
||||
|
||||
/* Desc: void v_rect32 (int color);
|
||||
*
|
||||
@@ -388,38 +394,38 @@ _v_rect24:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_rect32
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_rect32
|
||||
_v_rect32:
|
||||
pushl %esi
|
||||
pushl %edi
|
||||
movl _vl_current_width, %esi
|
||||
movl 16(%esp), %edi
|
||||
movl 20(%esp), %ecx
|
||||
imull %esi, %edi
|
||||
movl 24(%esp), %edx
|
||||
subl %ecx, %esi
|
||||
addl 12(%esp), %edi
|
||||
shll $2, %esi
|
||||
shll $2, %edi
|
||||
movl 28(%esp), %eax
|
||||
addl _vl_current_draw_buffer, %edi
|
||||
.balign 4
|
||||
0:
|
||||
pushl %ecx
|
||||
.balign 4
|
||||
1:
|
||||
movl %eax, (%edi)
|
||||
addl $4, %edi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
popl %ecx
|
||||
addl %esi, %edi
|
||||
decl %edx
|
||||
jnz 0b
|
||||
popl %edi
|
||||
popl %esi
|
||||
ret
|
||||
PUSH_L (ESI)
|
||||
PUSH_L (EDI)
|
||||
MOV_L (CONTENT(_vl_current_width), ESI)
|
||||
MOV_L (REGOFF(16, ESP), EDI)
|
||||
MOV_L (REGOFF(20, ESP), ECX)
|
||||
IMUL_L (ESI, EDI)
|
||||
MOV_L (REGOFF(24, ESP), EDX)
|
||||
SUB_L (ECX, ESI)
|
||||
ADD_L (REGOFF(12, ESP), EDI)
|
||||
SHL_L (CONST(2), ESI)
|
||||
SHL_L (CONST(2), EDI)
|
||||
MOV_L (REGOFF(28, ESP), EAX)
|
||||
ADD_L (CONTENT(_vl_current_draw_buffer), EDI)
|
||||
ALIGNTEXT4
|
||||
TLBL(0):
|
||||
PUSH_L (ECX)
|
||||
ALIGNTEXT4
|
||||
TLBL(1):
|
||||
MOV_L (EAX, REGIND(EDI))
|
||||
ADD_L (CONST(4), EDI)
|
||||
DEC_L (ECX)
|
||||
jnz TLBL(1)
|
||||
POP_L (ECX)
|
||||
ADD_L (ESI, EDI)
|
||||
DEC_L (EDX)
|
||||
jnz TLBL(0)
|
||||
POP_L (EDI)
|
||||
POP_L (ESI)
|
||||
RET
|
||||
|
||||
/* Desc: void v_putpixel8 (unsigned int offset, int color);
|
||||
*
|
||||
@@ -428,14 +434,14 @@ _v_rect32:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_putpixel8
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_putpixel8
|
||||
_v_putpixel8:
|
||||
movl 8(%esp), %ecx
|
||||
movl 4(%esp), %edx
|
||||
movl _vl_current_draw_buffer, %eax
|
||||
movb %cl, (%eax,%edx)
|
||||
ret
|
||||
MOV_L (REGOFF(8, ESP), ECX)
|
||||
MOV_L (REGOFF(4, ESP), EDX)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), EAX)
|
||||
MOV_B (CL, REGBI(EAX,EDX))
|
||||
RET
|
||||
|
||||
/* Desc: void v_putpixel16 (unsigned int offset, int color);
|
||||
*
|
||||
@@ -444,14 +450,14 @@ _v_putpixel8:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_putpixel16
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_putpixel16
|
||||
_v_putpixel16:
|
||||
movl 8(%esp), %ecx
|
||||
movl 4(%esp), %edx
|
||||
movl _vl_current_draw_buffer, %eax
|
||||
movw %cx, (%eax,%edx,2)
|
||||
ret
|
||||
MOV_L (REGOFF(8, ESP), ECX)
|
||||
MOV_L (REGOFF(4, ESP), EDX)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), EAX)
|
||||
MOV_W (CX, REGBIS(EAX,EDX,2))
|
||||
RET
|
||||
|
||||
/* Desc: void v_putpixel24 (unsigned int offset, int color);
|
||||
*
|
||||
@@ -460,17 +466,17 @@ _v_putpixel16:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_putpixel24
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_putpixel24
|
||||
_v_putpixel24:
|
||||
movl 4(%esp), %eax
|
||||
movl 8(%esp), %edx
|
||||
movl _vl_current_draw_buffer, %ecx
|
||||
leal (%eax,%eax,2), %eax
|
||||
movw %dx, (%ecx,%eax)
|
||||
shrl $16, %edx
|
||||
movb %dl, 2(%ecx,%eax)
|
||||
ret
|
||||
MOV_L (REGOFF(4, ESP), EAX)
|
||||
MOV_L (REGOFF(8, ESP), EDX)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), ECX)
|
||||
LEA_L (REGBIS(EAX,EAX,2), EAX)
|
||||
MOV_W (DX, REGBI(ECX,EAX))
|
||||
SHR_L (CONST(16), EDX)
|
||||
MOV_B (DL, REGBID(ECX,EAX,2))
|
||||
RET
|
||||
|
||||
/* Desc: void v_putpixel32 (unsigned int offset, int color);
|
||||
*
|
||||
@@ -479,11 +485,11 @@ _v_putpixel24:
|
||||
*
|
||||
* Note: uses current draw buffer
|
||||
*/
|
||||
.p2align 5,,31
|
||||
.global _v_putpixel32
|
||||
ALIGNTEXT32
|
||||
GLOBL _v_putpixel32
|
||||
_v_putpixel32:
|
||||
movl 8(%esp), %ecx
|
||||
movl 4(%esp), %edx
|
||||
movl _vl_current_draw_buffer, %eax
|
||||
movl %ecx, (%eax,%edx,4)
|
||||
ret
|
||||
MOV_L (REGOFF(8, ESP), ECX)
|
||||
MOV_L (REGOFF(4, ESP), EDX)
|
||||
MOV_L (CONTENT(_vl_current_draw_buffer), EAX)
|
||||
MOV_L (ECX, REGBIS(EAX,EDX,4))
|
||||
RET
|
||||
|
@@ -1,142 +0,0 @@
|
||||
/*
|
||||
* GLX Hardware Device Driver common code
|
||||
*
|
||||
* Based on the original MGA G200 driver (c) 1999 Wittawat Yamwong
|
||||
*
|
||||
* 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
|
||||
* WITTAWAT YAMWONG, OR ANY OTHER CONTRIBUTORS 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.
|
||||
*
|
||||
*
|
||||
* Wittawat Yamwong <Wittawat.Yamwong@stud.uni-hannover.de>
|
||||
*/
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/common/hwlog.c,v 1.3 2001/08/18 02:51:03 dawes Exp $ */
|
||||
|
||||
#include "hwlog.h"
|
||||
hwlog_t hwlog = { 0,0,0, "[???] "};
|
||||
|
||||
|
||||
/* Should be shared, but is this a good place for it?
|
||||
*/
|
||||
#include <sys/time.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
|
||||
int usec( void )
|
||||
{
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
|
||||
gettimeofday( &tv, &tz );
|
||||
|
||||
return (tv.tv_sec & 2047) * 1000000 + tv.tv_usec;
|
||||
}
|
||||
|
||||
|
||||
#ifdef HW_LOG_ENABLED
|
||||
int hwOpenLog(const char *filename, char *prefix)
|
||||
{
|
||||
hwCloseLog();
|
||||
hwSetLogLevel(0);
|
||||
hwlog.prefix=prefix;
|
||||
if (!filename)
|
||||
return -1;
|
||||
if ((hwlog.file = fopen(filename,"w")) == NULL)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void hwCloseLog()
|
||||
{
|
||||
if (hwlog.file) {
|
||||
fclose(hwlog.file);
|
||||
hwlog.file = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int hwIsLogReady()
|
||||
{
|
||||
return (hwlog.file != NULL);
|
||||
}
|
||||
|
||||
void hwSetLogLevel(int level)
|
||||
{
|
||||
hwlog.level = level;
|
||||
}
|
||||
|
||||
int hwGetLogLevel()
|
||||
{
|
||||
return hwlog.level;
|
||||
}
|
||||
|
||||
void hwLog(int level, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap,format);
|
||||
hwLogv(level,format,ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void hwLogv(int l, const char *format, va_list ap)
|
||||
{
|
||||
if (hwlog.file && (l <= hwlog.level)) {
|
||||
vfprintf(hwlog.file,format,ap);
|
||||
fflush(hwlog.file);
|
||||
}
|
||||
}
|
||||
|
||||
void hwMsg(int l, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
|
||||
if (l <= hwlog.level) {
|
||||
if (hwIsLogReady()) {
|
||||
int t = usec();
|
||||
|
||||
hwLog(l, "%6i:", t - hwlog.timeTemp);
|
||||
hwlog.timeTemp = t;
|
||||
hwLogv(l, format, ap);
|
||||
} else {
|
||||
fprintf(stderr, hwlog.prefix);
|
||||
vfprintf(stderr, format, ap);
|
||||
}
|
||||
}
|
||||
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
#else /* ifdef HW_LOG_ENABLED */
|
||||
|
||||
int hwlogdummy()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void hwError(const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
|
||||
fprintf(stderr, hwlog.prefix);
|
||||
vfprintf(stderr, format, ap);
|
||||
hwLogv(0, format, ap);
|
||||
|
||||
va_end(ap);
|
||||
}
|
@@ -1,101 +0,0 @@
|
||||
/*
|
||||
* GLX Hardware Device Driver common code
|
||||
*
|
||||
* Based on the original MGA G200 driver (c) 1999 Wittawat Yamwong
|
||||
*
|
||||
* 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
|
||||
* WITTAWAT YAMWONG, OR ANY OTHER CONTRIBUTORS 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.
|
||||
*
|
||||
*
|
||||
* Wittawat Yamwong <Wittawat.Yamwong@stud.uni-hannover.de>
|
||||
*/
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/common/hwlog.h,v 1.5 2001/10/31 23:22:57 tsi Exp $ */
|
||||
|
||||
/* Usage:
|
||||
* - use mgaError for error messages. Always write to X error and log file.
|
||||
* - use mgaMsg for debugging. Can be disabled by undefining MGA_LOG_ENABLED.
|
||||
*/
|
||||
|
||||
#ifndef HWLOG_INC
|
||||
#define HWLOG_INC
|
||||
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define DBG_LEVEL_BASE 1
|
||||
#define DBG_LEVEL_VERBOSE 10
|
||||
#define DBG_LEVEL_ENTEREXIT 20
|
||||
|
||||
typedef struct
|
||||
{
|
||||
FILE *file;
|
||||
int level;
|
||||
unsigned int timeTemp;
|
||||
char *prefix;
|
||||
} hwlog_t;
|
||||
|
||||
extern hwlog_t hwlog;
|
||||
|
||||
|
||||
#ifdef HW_LOG_ENABLED
|
||||
|
||||
/* open and close log file. */
|
||||
int hwOpenLog(const char *filename, char *prefix);
|
||||
void hwCloseLog(void);
|
||||
|
||||
/* return 1 if log file is succesfully opened */
|
||||
int hwIsLogReady(void);
|
||||
|
||||
/* set current log level to 'level'. Messages with level less than or equal
|
||||
the current log level will be written to the log file. */
|
||||
void hwSetLogLevel(int level);
|
||||
int hwGetLogLevel(void);
|
||||
|
||||
/* hwLog and hwLogv write a message to the log file. */
|
||||
/* do not call these directly, use hwMsg() instead */
|
||||
void hwLog(int level, const char *format, ...);
|
||||
void hwLogv(int level, const char *format, va_list ap);
|
||||
|
||||
int usec( void );
|
||||
|
||||
/* hwMsg writes a message to the log file or to the standard X error file. */
|
||||
void hwMsg(int level, const char *format, ...);
|
||||
|
||||
|
||||
#else
|
||||
|
||||
|
||||
static __inline__ int hwOpenLog(const char *f, char *prefix) { hwlog.prefix=prefix; return -1; }
|
||||
#define hwIsLogReady() (0)
|
||||
#define hwGetLogLevel() (-1)
|
||||
#define hwLogLevel(n) (0)
|
||||
#define hwLog()
|
||||
#define hwMsg()
|
||||
|
||||
#define hwCloseLog()
|
||||
#define hwSetLogLevel(x)
|
||||
#define hwLogv(l,f,a)
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
void hwError(const char *format, ...);
|
||||
|
||||
|
||||
#endif
|
@@ -27,14 +27,13 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#include "mm.h"
|
||||
#include "hwlog.h"
|
||||
|
||||
|
||||
void mmDumpMemInfo( memHeap_t *heap )
|
||||
{
|
||||
TMemBlock *p;
|
||||
|
||||
fprintf(stderr, "Memory heap %p:\n", heap);
|
||||
fprintf(stderr, "Memory heap %p:\n", (void *)heap);
|
||||
if (heap == 0) {
|
||||
fprintf(stderr, " heap == 0\n");
|
||||
} else {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright 2000-2001 VA Linux Systems, Inc.
|
||||
* (c) Copyright IBM Corporation 2002
|
||||
* (C) Copyright IBM Corporation 2002, 2003
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "texmem.h"
|
||||
#include "simple_list.h"
|
||||
#include "imports.h"
|
||||
#include "macros.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
@@ -156,22 +157,22 @@ static void printLocalLRU( driTexHeap * heap, const char *callername )
|
||||
continue;
|
||||
if (!t->tObj) {
|
||||
fprintf( stderr, "Placeholder (%p) %d at 0x%x sz 0x%x\n",
|
||||
t,
|
||||
(void *)t,
|
||||
t->memBlock->ofs / sz,
|
||||
t->memBlock->ofs,
|
||||
t->memBlock->size );
|
||||
} else {
|
||||
fprintf( stderr, "Texture (%p) at 0x%x sz 0x%x\n",
|
||||
t,
|
||||
(void *)t,
|
||||
t->memBlock->ofs,
|
||||
t->memBlock->size );
|
||||
}
|
||||
}
|
||||
foreach ( t, heap->swapped_objects ) {
|
||||
if (!t->tObj) {
|
||||
fprintf( stderr, "Swapped Placeholder (%p)\n", t );
|
||||
fprintf( stderr, "Swapped Placeholder (%p)\n", (void *)t );
|
||||
} else {
|
||||
fprintf( stderr, "Swapped Texture (%p)\n", t );
|
||||
fprintf( stderr, "Swapped Texture (%p)\n", (void *)t );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -190,7 +191,7 @@ static void printGlobalLRU( driTexHeap * heap, const char *callername )
|
||||
int i, j;
|
||||
|
||||
fprintf( stderr, "%s in %s:\nGlobal LRU, heap %d list %p:\n",
|
||||
__FUNCTION__, callername, heap->heapId, list );
|
||||
__FUNCTION__, callername, heap->heapId, (void *)list );
|
||||
|
||||
for ( i = 0, j = heap->nrRegions ; i < heap->nrRegions ; i++ ) {
|
||||
fprintf( stderr, "list[%d] age %d next %d prev %d in_use %d\n",
|
||||
@@ -323,9 +324,9 @@ void driDestroyTextureObject( driTextureObject * t )
|
||||
if ( 0 ) {
|
||||
fprintf( stderr, "[%s:%d] freeing %p (tObj = %p, DriverData = %p)\n",
|
||||
__FILE__, __LINE__,
|
||||
t,
|
||||
(t != NULL) ? t->tObj : NULL,
|
||||
(t != NULL && t->tObj != NULL) ? t->tObj->DriverData : NULL );
|
||||
(void *)t,
|
||||
(void *)((t != NULL) ? t->tObj : NULL),
|
||||
(void *)((t != NULL && t->tObj != NULL) ? t->tObj->DriverData : NULL ));
|
||||
}
|
||||
|
||||
if ( t != NULL ) {
|
||||
@@ -355,7 +356,7 @@ void driDestroyTextureObject( driTextureObject * t )
|
||||
}
|
||||
|
||||
if ( 0 ) {
|
||||
fprintf( stderr, "[%s:%d] done freeing %p\n", __FILE__, __LINE__, t );
|
||||
fprintf( stderr, "[%s:%d] done freeing %p\n", __FILE__, __LINE__, (void *)t );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -645,7 +646,7 @@ driCreateTextureHeap( unsigned heap_id, void * context, unsigned size,
|
||||
if ( 0 )
|
||||
fprintf( stderr, "%s( %u, %p, %u, %u, %u )\n",
|
||||
__FUNCTION__,
|
||||
heap_id, context, size, alignmentShift, nr_regions );
|
||||
heap_id, (void *)context, size, alignmentShift, nr_regions );
|
||||
|
||||
heap = (driTexHeap *) CALLOC( sizeof( driTexHeap ) );
|
||||
if ( heap != NULL ) {
|
||||
@@ -688,7 +689,7 @@ driCreateTextureHeap( unsigned heap_id, void * context, unsigned size,
|
||||
|
||||
|
||||
if ( 0 )
|
||||
fprintf( stderr, "%s returning %p\n", __FUNCTION__, heap );
|
||||
fprintf( stderr, "%s returning %p\n", __FUNCTION__, (void *)heap );
|
||||
|
||||
return heap;
|
||||
}
|
||||
@@ -894,7 +895,7 @@ get_max_size( unsigned nr_heaps,
|
||||
/**
|
||||
* Given the amount of texture memory, the number of texture units, and the
|
||||
* maximum size of a texel, calculate the maximum texture size the driver can
|
||||
* adverteise.
|
||||
* advertise.
|
||||
*
|
||||
* \param heaps Texture heaps for this card
|
||||
* \param nr_heap Number of texture heaps
|
||||
@@ -1097,7 +1098,7 @@ driValidateTextureHeaps( driTexHeap * const * texture_heaps,
|
||||
if ( !check_in_heap( t, heap ) ) {
|
||||
fprintf( stderr, "%s memory block for texture object @ %p not "
|
||||
"found in heap #%d\n",
|
||||
__FUNCTION__, t, i );
|
||||
__FUNCTION__, (void *)t, i );
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
@@ -1105,7 +1106,7 @@ driValidateTextureHeaps( driTexHeap * const * texture_heaps,
|
||||
if ( t->totalSize > t->memBlock->size ) {
|
||||
fprintf( stderr, "%s: Memory block for texture object @ %p is "
|
||||
"only %u bytes, but %u are required\n",
|
||||
__FUNCTION__, t, t->totalSize, t->memBlock->size );
|
||||
__FUNCTION__, (void *)t, t->totalSize, t->memBlock->size );
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
@@ -1159,15 +1160,76 @@ driValidateTextureHeaps( driTexHeap * const * texture_heaps,
|
||||
foreach ( t, swapped ) {
|
||||
if ( t->memBlock != NULL ) {
|
||||
fprintf( stderr, "%s: Swapped texobj %p has non-NULL memblock %p\n",
|
||||
__FUNCTION__, t, t->memBlock );
|
||||
__FUNCTION__, (void *)t, (void *)t->memBlock );
|
||||
return GL_FALSE;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
#if 0
|
||||
fprintf( stderr, "%s: swapped texture count = %u\n", i );
|
||||
fprintf( stderr, "%s: swapped texture count = %u\n", __FUNCTION__, i );
|
||||
#endif
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/**
|
||||
* Compute which mipmap levels that really need to be sent to the hardware.
|
||||
* This depends on the base image size, GL_TEXTURE_MIN_LOD,
|
||||
* GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL.
|
||||
*/
|
||||
|
||||
void
|
||||
driCalculateTextureFirstLastLevel( driTextureObject * t )
|
||||
{
|
||||
struct gl_texture_object * const tObj = t->tObj;
|
||||
const struct gl_texture_image * const baseImage =
|
||||
tObj->Image[tObj->BaseLevel];
|
||||
|
||||
/* These must be signed values. MinLod and MaxLod can be negative numbers,
|
||||
* and having firstLevel and lastLevel as signed prevents the need for
|
||||
* extra sign checks.
|
||||
*/
|
||||
int firstLevel;
|
||||
int lastLevel;
|
||||
|
||||
/* Yes, this looks overly complicated, but it's all needed.
|
||||
*/
|
||||
|
||||
switch (tObj->Target) {
|
||||
case GL_TEXTURE_1D:
|
||||
case GL_TEXTURE_2D:
|
||||
case GL_TEXTURE_3D:
|
||||
case GL_TEXTURE_CUBE_MAP:
|
||||
if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) {
|
||||
/* GL_NEAREST and GL_LINEAR only care about GL_TEXTURE_BASE_LEVEL.
|
||||
*/
|
||||
|
||||
firstLevel = lastLevel = tObj->BaseLevel;
|
||||
}
|
||||
else {
|
||||
firstLevel = tObj->BaseLevel + (GLint)(tObj->MinLod + 0.5);
|
||||
firstLevel = MAX2(firstLevel, tObj->BaseLevel);
|
||||
lastLevel = tObj->BaseLevel + (GLint)(tObj->MaxLod + 0.5);
|
||||
lastLevel = MAX2(lastLevel, t->tObj->BaseLevel);
|
||||
lastLevel = MIN2(lastLevel, t->tObj->BaseLevel + baseImage->MaxLog2);
|
||||
lastLevel = MIN2(lastLevel, t->tObj->MaxLevel);
|
||||
lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */
|
||||
}
|
||||
break;
|
||||
case GL_TEXTURE_RECTANGLE_NV:
|
||||
case GL_TEXTURE_4D_SGIS:
|
||||
firstLevel = lastLevel = 0;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
/* save these values */
|
||||
t->firstLevel = firstLevel;
|
||||
t->lastLevel = lastLevel;
|
||||
}
|
||||
|
@@ -290,4 +290,6 @@ void driInitTextureObjects( GLcontext *ctx, driTextureObject * swapped,
|
||||
GLboolean driValidateTextureHeaps( driTexHeap * const * texture_heaps,
|
||||
unsigned nr_heaps, const driTextureObject * swapped );
|
||||
|
||||
extern void driCalculateTextureFirstLastLevel( driTextureObject * t );
|
||||
|
||||
#endif /* DRI_TEXMEM_H */
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include "macros.h"
|
||||
#include "dd.h"
|
||||
#include "vblank.h"
|
||||
#include "xmlpool.h"
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
@@ -163,9 +164,9 @@ int driWaitForMSC32( __DRIdrawablePrivate *priv,
|
||||
/* FIXME: This doesn't seem like the right thing to return here.
|
||||
*/
|
||||
#ifndef _SOLO
|
||||
return GLX_BAD_CONTEXT;
|
||||
return GLX_BAD_CONTEXT;
|
||||
#else
|
||||
return -1;
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -183,25 +184,56 @@ int driWaitForMSC32( __DRIdrawablePrivate *priv,
|
||||
/****************************************************************************/
|
||||
/**
|
||||
* Gets a set of default vertical-blank-wait flags based on the internal GLX
|
||||
* API version and several environment variables.
|
||||
* API version and several configuration options.
|
||||
*/
|
||||
|
||||
GLuint driGetDefaultVBlankFlags( void )
|
||||
GLuint driGetDefaultVBlankFlags( const driOptionCache *optionCache )
|
||||
{
|
||||
GLuint flags = 0;
|
||||
|
||||
int vblank_mode;
|
||||
|
||||
flags |= (driCompareGLXAPIVersion( 20030317 ) >= 0)
|
||||
? VBLANK_FLAG_INTERVAL : 0;
|
||||
flags |= (getenv("LIBGL_SYNC_REFRESH") != NULL)
|
||||
? VBLANK_FLAG_SYNC : 0;
|
||||
flags |= (getenv("LIBGL_THROTTLE_REFRESH") != NULL)
|
||||
? VBLANK_FLAG_THROTTLE : 0;
|
||||
|
||||
if ( driCheckOption( optionCache, "vblank_mode", DRI_ENUM ) )
|
||||
vblank_mode = driQueryOptioni( optionCache, "vblank_mode" );
|
||||
else
|
||||
vblank_mode = DRI_CONF_VBLANK_DEF_INTERVAL_1;
|
||||
|
||||
switch (vblank_mode) {
|
||||
case DRI_CONF_VBLANK_NEVER:
|
||||
flags = 0;
|
||||
break;
|
||||
case DRI_CONF_VBLANK_DEF_INTERVAL_0:
|
||||
break;
|
||||
case DRI_CONF_VBLANK_DEF_INTERVAL_1:
|
||||
flags |= VBLANK_FLAG_THROTTLE;
|
||||
break;
|
||||
case DRI_CONF_VBLANK_ALWAYS_SYNC:
|
||||
flags |= VBLANK_FLAG_SYNC;
|
||||
break;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/**
|
||||
* Sets the default swap interval when the drawable is first bound to a
|
||||
* direct rendering context.
|
||||
*/
|
||||
|
||||
void driDrawableInitVBlank( __DRIdrawablePrivate *priv, GLuint flags )
|
||||
{
|
||||
#ifndef _SOLO
|
||||
if ( priv->pdraw->swap_interval == (unsigned)-1 ) {
|
||||
priv->pdraw->swap_interval = (flags & VBLANK_FLAG_THROTTLE) != 0 ? 1 : 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/**
|
||||
* Wrapper to call \c drmWaitVBlank. The main purpose of this function is to
|
||||
@@ -265,7 +297,10 @@ driWaitForVBlank( const __DRIdrawablePrivate *priv, GLuint * vbl_seq,
|
||||
|
||||
|
||||
*missed_deadline = GL_FALSE;
|
||||
if ( (flags & VBLANK_FLAG_NO_IRQ) != 0 ) {
|
||||
if ( (flags & (VBLANK_FLAG_INTERVAL |
|
||||
VBLANK_FLAG_THROTTLE |
|
||||
VBLANK_FLAG_SYNC)) == 0 ||
|
||||
(flags & VBLANK_FLAG_NO_IRQ) != 0 ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -298,6 +333,9 @@ driWaitForVBlank( const __DRIdrawablePrivate *priv, GLuint * vbl_seq,
|
||||
#else
|
||||
interval = 0;
|
||||
#endif
|
||||
/* this must have been initialized when the drawable was first bound
|
||||
* to a direct rendering context. */
|
||||
assert ( interval != (unsigned)-1 );
|
||||
}
|
||||
else if ( (flags & VBLANK_FLAG_THROTTLE) != 0 ) {
|
||||
interval = 1;
|
||||
|
@@ -32,6 +32,7 @@
|
||||
|
||||
#include "context.h"
|
||||
#include "dri_util.h"
|
||||
#include "xmlconfig.h"
|
||||
|
||||
#define VBLANK_FLAG_INTERVAL (1U << 0) /* Respect the swap_interval setting
|
||||
*/
|
||||
@@ -45,7 +46,8 @@
|
||||
extern int driGetMSC32( __DRIscreenPrivate * priv, int64_t * count );
|
||||
extern int driWaitForMSC32( __DRIdrawablePrivate *priv,
|
||||
int64_t target_msc, int64_t divisor, int64_t remainder, int64_t * msc );
|
||||
extern GLuint driGetDefaultVBlankFlags( void );
|
||||
extern GLuint driGetDefaultVBlankFlags( const driOptionCache *optionCache );
|
||||
extern void driDrawableInitVBlank ( __DRIdrawablePrivate *priv, GLuint flags );
|
||||
extern int driWaitForVBlank( const __DRIdrawablePrivate *priv,
|
||||
GLuint * vbl_seq, GLuint flags, GLboolean * missed_deadline );
|
||||
|
||||
|
862
src/mesa/drivers/dri/common/xmlconfig.c
Normal file
862
src/mesa/drivers/dri/common/xmlconfig.c
Normal file
@@ -0,0 +1,862 @@
|
||||
/*
|
||||
* XML DRI client-side driver configuration
|
||||
* Copyright (C) 2003 Felix Kuehling
|
||||
*
|
||||
* 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
|
||||
* FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS 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 xmlconfig.c
|
||||
* \brief Driver-independent client-side part of the XML configuration
|
||||
* \author Felix Kuehling
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <expat.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include "imports.h"
|
||||
#include "dri_util.h"
|
||||
#include "xmlconfig.h"
|
||||
|
||||
/*
|
||||
* OS dependent ways of getting the name of the running program
|
||||
*/
|
||||
#if (defined(__unix__) || defined(unix)) && !defined(USG)
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
|
||||
#undef GET_PROGRAM_NAME
|
||||
|
||||
#if defined(__GNU_LIBRARY__) || defined(__GLIBC__)
|
||||
# define GET_PROGRAM_NAME() program_invocation_short_name
|
||||
#elif defined(__FreeBSD__) && (__FreeBSD__ >= 2)
|
||||
# include <osreldate.h>
|
||||
# if (__FreeBSD_version >= 440000)
|
||||
# include <stdlib.h>
|
||||
# define GET_PROGRAM_NAME() getprogname()
|
||||
# endif
|
||||
#elif defined(__NetBSD__) && defined(__NetBSD_Version) && (__NetBSD_Version >= 106000100)
|
||||
# include <stdlib.h>
|
||||
# define GET_PROGRAM_NAME() getprogname()
|
||||
#endif
|
||||
|
||||
#if !defined(GET_PROGRAM_NAME)
|
||||
# if defined(OpenBSD) || defined(NetBSD)
|
||||
/* This is a hack. It's said to work on OpenBSD, NetBSD and GNU. It's
|
||||
* used as a last resort, if there is no documented facility available. */
|
||||
static const char *__getProgramName () {
|
||||
extern const char *__progname;
|
||||
return progname;
|
||||
}
|
||||
# define GET_PROGRAM_NAME() __getProgramName()
|
||||
# else
|
||||
# define GET_PROGRAM_NAME() ""
|
||||
# warning "Per application configuration won't with your OS version work."
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/** \brief Find an option in an option cache with the name as key */
|
||||
static GLuint findOption (const driOptionCache *cache, const char *name) {
|
||||
GLuint len = strlen (name);
|
||||
GLuint size = 1 << cache->tableSize, mask = size - 1;
|
||||
GLuint hash = 0;
|
||||
GLuint i, shift;
|
||||
|
||||
/* compute a hash from the variable length name */
|
||||
for (i = 0, shift = 0; i < len; ++i, shift = (shift+8) & 31)
|
||||
hash += (GLuint)name[i] << shift;
|
||||
hash *= hash;
|
||||
hash = (hash >> (16-cache->tableSize/2)) & mask;
|
||||
|
||||
/* this is just the starting point of the linear search for the option */
|
||||
for (i = 0; i < size; ++i, hash = (hash+1) & mask) {
|
||||
/* if we hit an empty entry then the option is not defined (yet) */
|
||||
if (cache->info[hash].name == 0)
|
||||
break;
|
||||
else if (!strcmp (name, cache->info[hash].name))
|
||||
break;
|
||||
}
|
||||
/* this assertion fails if the hash table is full */
|
||||
assert (i < size);
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
/** \brief Count the real number of options in an option cache */
|
||||
static GLuint countOptions (const driOptionCache *cache) {
|
||||
GLuint size = 1 << cache->tableSize;
|
||||
GLuint i, count = 0;
|
||||
for (i = 0; i < size; ++i)
|
||||
if (cache->info[i].name)
|
||||
count++;
|
||||
return count;
|
||||
}
|
||||
|
||||
/** \brief Like strdup but using MALLOC and with error checking. */
|
||||
#define XSTRDUP(dest,source) do { \
|
||||
GLuint len = strlen (source); \
|
||||
if (!(dest = MALLOC (len+1))) { \
|
||||
fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__); \
|
||||
abort(); \
|
||||
} \
|
||||
memcpy (dest, source, len+1); \
|
||||
} while (0)
|
||||
|
||||
static int compare (const void *a, const void *b) {
|
||||
return strcmp (*(char *const*)a, *(char *const*)b);
|
||||
}
|
||||
/** \brief Binary search in a string array. */
|
||||
static GLuint bsearchStr (const XML_Char *name,
|
||||
const XML_Char *elems[], GLuint count) {
|
||||
const XML_Char **found;
|
||||
found = bsearch (&name, elems, count, sizeof (XML_Char *), compare);
|
||||
if (found)
|
||||
return found - elems;
|
||||
else
|
||||
return count;
|
||||
}
|
||||
|
||||
/** \brief Parse a value of a given type. */
|
||||
static GLboolean parseValue (driOptionValue *v, driOptionType type,
|
||||
const XML_Char *string) {
|
||||
const XML_Char *tail;
|
||||
/* skip leading white-space */
|
||||
string += strspn (string, " \f\n\r\t\v");
|
||||
switch (type) {
|
||||
case DRI_BOOL:
|
||||
if (!strcmp (string, "false")) {
|
||||
v->_bool = GL_FALSE;
|
||||
tail = string + 5;
|
||||
} else if (!strcmp (string, "true")) {
|
||||
v->_bool = GL_TRUE;
|
||||
tail = string + 4;
|
||||
}
|
||||
else
|
||||
return GL_FALSE;
|
||||
break;
|
||||
case DRI_ENUM: /* enum is just a special integer */
|
||||
case DRI_INT:
|
||||
v->_int = strtol (string, (char **)&tail, 0);
|
||||
break;
|
||||
case DRI_FLOAT:
|
||||
v->_float = strtod (string, (char **)&tail);
|
||||
break;
|
||||
}
|
||||
|
||||
if (tail == string)
|
||||
return GL_FALSE; /* empty string (or containing only white-space) */
|
||||
/* skip trailing white space */
|
||||
if (*tail)
|
||||
tail += strspn (tail, " \f\n\r\t\v");
|
||||
if (*tail)
|
||||
return GL_FALSE; /* something left over that is not part of value */
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
/** \brief Parse a list of ranges of type info->type. */
|
||||
static GLboolean parseRanges (driOptionInfo *info, const XML_Char *string) {
|
||||
XML_Char *cp, *range;
|
||||
GLuint nRanges, i;
|
||||
driOptionRange *ranges;
|
||||
|
||||
XSTRDUP (cp, string);
|
||||
/* pass 1: determine the number of ranges (number of commas + 1) */
|
||||
range = cp;
|
||||
for (nRanges = 1; *range; ++range)
|
||||
if (*range == ',')
|
||||
++nRanges;
|
||||
|
||||
if ((ranges = MALLOC (nRanges*sizeof(driOptionRange))) == NULL) {
|
||||
fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__);
|
||||
abort();
|
||||
}
|
||||
|
||||
/* pass 2: parse all ranges into preallocated array */
|
||||
range = cp;
|
||||
for (i = 0; i < nRanges; ++i) {
|
||||
XML_Char *end, *sep;
|
||||
assert (range);
|
||||
end = strchr (range, ',');
|
||||
if (end)
|
||||
*end = '\0';
|
||||
sep = strchr (range, ':');
|
||||
if (sep) { /* non-empty interval */
|
||||
*sep = '\0';
|
||||
if (!parseValue (&ranges[i].start, info->type, range) ||
|
||||
!parseValue (&ranges[i].end, info->type, sep+1))
|
||||
break;
|
||||
if (info->type == DRI_INT &&
|
||||
ranges[i].start._int > ranges[i].end._int)
|
||||
break;
|
||||
if (info->type == DRI_FLOAT &&
|
||||
ranges[i].start._float > ranges[i].end._float)
|
||||
break;
|
||||
} else { /* empty interval */
|
||||
if (!parseValue (&ranges[i].start, info->type, range))
|
||||
break;
|
||||
ranges[i].end = ranges[i].start;
|
||||
}
|
||||
if (end)
|
||||
range = end+1;
|
||||
else
|
||||
range = NULL;
|
||||
}
|
||||
FREE (cp);
|
||||
if (i < nRanges) {
|
||||
FREE (ranges);
|
||||
return GL_FALSE;
|
||||
} else
|
||||
assert (range == NULL);
|
||||
|
||||
info->nRanges = nRanges;
|
||||
info->ranges = ranges;
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
/** \brief Check if a value is in one of info->ranges. */
|
||||
static GLboolean checkValue (const driOptionValue *v, const driOptionInfo *info) {
|
||||
GLuint i;
|
||||
assert (info->type != DRI_BOOL); /* should be caught by the parser */
|
||||
if (info->nRanges == 0)
|
||||
return GL_TRUE;
|
||||
switch (info->type) {
|
||||
case DRI_ENUM: /* enum is just a special integer */
|
||||
case DRI_INT:
|
||||
for (i = 0; i < info->nRanges; ++i)
|
||||
if (v->_int >= info->ranges[i].start._int &&
|
||||
v->_int <= info->ranges[i].end._int)
|
||||
return GL_TRUE;
|
||||
break;
|
||||
case DRI_FLOAT:
|
||||
for (i = 0; i < info->nRanges; ++i)
|
||||
if (v->_float >= info->ranges[i].start._float &&
|
||||
v->_float <= info->ranges[i].end._float)
|
||||
return GL_TRUE;
|
||||
break;
|
||||
default:
|
||||
assert (0); /* should never happen */
|
||||
}
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/** \brief Output a warning message. */
|
||||
#define XML_WARNING1(msg) do {\
|
||||
__driUtilMessage ("Warning in %s line %d, column %d: "msg, data->name, \
|
||||
XML_GetCurrentLineNumber(data->parser), \
|
||||
XML_GetCurrentColumnNumber(data->parser)); \
|
||||
} while (0)
|
||||
#define XML_WARNING(msg,args...) do { \
|
||||
__driUtilMessage ("Warning in %s line %d, column %d: "msg, data->name, \
|
||||
XML_GetCurrentLineNumber(data->parser), \
|
||||
XML_GetCurrentColumnNumber(data->parser), \
|
||||
args); \
|
||||
} while (0)
|
||||
/** \brief Output an error message. */
|
||||
#define XML_ERROR1(msg) do { \
|
||||
__driUtilMessage ("Error in %s line %d, column %d: "msg, data->name, \
|
||||
XML_GetCurrentLineNumber(data->parser), \
|
||||
XML_GetCurrentColumnNumber(data->parser)); \
|
||||
} while (0)
|
||||
#define XML_ERROR(msg,args...) do { \
|
||||
__driUtilMessage ("Error in %s line %d, column %d: "msg, data->name, \
|
||||
XML_GetCurrentLineNumber(data->parser), \
|
||||
XML_GetCurrentColumnNumber(data->parser), \
|
||||
args); \
|
||||
} while (0)
|
||||
/** \brief Output a fatal error message and abort. */
|
||||
#define XML_FATAL1(msg) do { \
|
||||
fprintf (stderr, "Fatal error in %s line %d, column %d: "msg"\n", \
|
||||
data->name, \
|
||||
XML_GetCurrentLineNumber(data->parser), \
|
||||
XML_GetCurrentColumnNumber(data->parser)); \
|
||||
abort();\
|
||||
} while (0)
|
||||
#define XML_FATAL(msg,args...) do { \
|
||||
fprintf (stderr, "Fatal error in %s line %d, column %d: "msg"\n", \
|
||||
data->name, \
|
||||
XML_GetCurrentLineNumber(data->parser), \
|
||||
XML_GetCurrentColumnNumber(data->parser), \
|
||||
args); \
|
||||
abort();\
|
||||
} while (0)
|
||||
|
||||
/** \brief Parser context for __driConfigOptions. */
|
||||
struct OptInfoData {
|
||||
const char *name;
|
||||
XML_Parser parser;
|
||||
driOptionCache *cache;
|
||||
GLboolean inDriInfo;
|
||||
GLboolean inSection;
|
||||
GLboolean inDesc;
|
||||
GLboolean inOption;
|
||||
GLboolean inEnum;
|
||||
int curOption;
|
||||
};
|
||||
|
||||
/** \brief Elements in __driConfigOptions. */
|
||||
enum OptInfoElem {
|
||||
OI_DESCRIPTION = 0, OI_DRIINFO, OI_ENUM, OI_OPTION, OI_SECTION, OI_COUNT
|
||||
};
|
||||
static const XML_Char *OptInfoElems[] = {
|
||||
"description", "driinfo", "enum", "option", "section"
|
||||
};
|
||||
|
||||
/** \brief Parse attributes of an enum element.
|
||||
*
|
||||
* We're not actually interested in the data. Just make sure this is ok
|
||||
* for external configuration tools.
|
||||
*/
|
||||
static void parseEnumAttr (struct OptInfoData *data, const XML_Char **attr) {
|
||||
GLuint i;
|
||||
const XML_Char *value = NULL, *text = NULL;
|
||||
driOptionValue v;
|
||||
GLuint opt = data->curOption;
|
||||
for (i = 0; attr[i]; i += 2) {
|
||||
if (!strcmp (attr[i], "value")) value = attr[i+1];
|
||||
else if (!strcmp (attr[i], "text")) text = attr[i+1];
|
||||
else XML_FATAL("illegal enum attribute: %s.", attr[i]);
|
||||
}
|
||||
if (!value) XML_FATAL1 ("value attribute missing in enum.");
|
||||
if (!text) XML_FATAL1 ("text attribute missing in enum.");
|
||||
if (!parseValue (&v, data->cache->info[opt].type, value))
|
||||
XML_FATAL ("illegal enum value: %s.", value);
|
||||
if (!checkValue (&v, &data->cache->info[opt]))
|
||||
XML_FATAL ("enum value out of valid range: %s.", value);
|
||||
}
|
||||
|
||||
/** \brief Parse attributes of a description element.
|
||||
*
|
||||
* We're not actually interested in the data. Just make sure this is ok
|
||||
* for external configuration tools.
|
||||
*/
|
||||
static void parseDescAttr (struct OptInfoData *data, const XML_Char **attr) {
|
||||
GLuint i;
|
||||
const XML_Char *lang = NULL, *text = NULL;
|
||||
for (i = 0; attr[i]; i += 2) {
|
||||
if (!strcmp (attr[i], "lang")) lang = attr[i+1];
|
||||
else if (!strcmp (attr[i], "text")) text = attr[i+1];
|
||||
else XML_FATAL("illegal description attribute: %s.", attr[i]);
|
||||
}
|
||||
if (!lang) XML_FATAL1 ("lang attribute missing in description.");
|
||||
if (!text) XML_FATAL1 ("text attribute missing in description.");
|
||||
}
|
||||
|
||||
/** \brief Parse attributes of an option element. */
|
||||
static void parseOptInfoAttr (struct OptInfoData *data, const XML_Char **attr) {
|
||||
enum OptAttr {OA_DEFAULT = 0, OA_NAME, OA_TYPE, OA_VALID, OA_COUNT};
|
||||
static const XML_Char *optAttr[] = {"default", "name", "type", "valid"};
|
||||
const XML_Char *attrVal[OA_COUNT] = {NULL, NULL, NULL, NULL};
|
||||
const char *defaultVal;
|
||||
driOptionCache *cache = data->cache;
|
||||
GLuint opt, i;
|
||||
for (i = 0; attr[i]; i += 2) {
|
||||
GLuint attrName = bsearchStr (attr[i], optAttr, OA_COUNT);
|
||||
if (attrName >= OA_COUNT)
|
||||
XML_FATAL ("illegal option attribute: %s", attr[i]);
|
||||
attrVal[attrName] = attr[i+1];
|
||||
}
|
||||
if (!attrVal[OA_NAME]) XML_FATAL1 ("name attribute missing in option.");
|
||||
if (!attrVal[OA_TYPE]) XML_FATAL1 ("type attribute missing in option.");
|
||||
if (!attrVal[OA_DEFAULT]) XML_FATAL1 ("default attribute missing in option.");
|
||||
|
||||
opt = findOption (cache, attrVal[OA_NAME]);
|
||||
if (cache->info[opt].name)
|
||||
XML_FATAL ("option %s redefined.", attrVal[OA_NAME]);
|
||||
data->curOption = opt;
|
||||
|
||||
XSTRDUP (cache->info[opt].name, attrVal[OA_NAME]);
|
||||
|
||||
if (!strcmp (attrVal[OA_TYPE], "bool"))
|
||||
cache->info[opt].type = DRI_BOOL;
|
||||
else if (!strcmp (attrVal[OA_TYPE], "enum"))
|
||||
cache->info[opt].type = DRI_ENUM;
|
||||
else if (!strcmp (attrVal[OA_TYPE], "int"))
|
||||
cache->info[opt].type = DRI_INT;
|
||||
else if (!strcmp (attrVal[OA_TYPE], "float"))
|
||||
cache->info[opt].type = DRI_FLOAT;
|
||||
else
|
||||
XML_FATAL ("illegal type in option: %s.", attrVal[OA_TYPE]);
|
||||
|
||||
defaultVal = getenv (cache->info[opt].name);
|
||||
if (defaultVal != NULL) {
|
||||
/* don't use XML_WARNING, we want the user to see this! */
|
||||
fprintf (stderr,
|
||||
"ATTENTION: default value of option %s overridden by environment.\n",
|
||||
cache->info[opt].name);
|
||||
} else
|
||||
defaultVal = attrVal[OA_DEFAULT];
|
||||
if (!parseValue (&cache->values[opt], cache->info[opt].type, defaultVal))
|
||||
XML_FATAL ("illegal default value: %s.", defaultVal);
|
||||
|
||||
if (attrVal[OA_VALID]) {
|
||||
if (cache->info[opt].type == DRI_BOOL)
|
||||
XML_FATAL1 ("boolean option with valid attribute.");
|
||||
if (!parseRanges (&cache->info[opt], attrVal[OA_VALID]))
|
||||
XML_FATAL ("illegal valid attribute: %s.", attrVal[OA_VALID]);
|
||||
if (!checkValue (&cache->values[opt], &cache->info[opt]))
|
||||
XML_FATAL ("default value out of valid range '%s': %s.",
|
||||
attrVal[OA_VALID], defaultVal);
|
||||
} else if (cache->info[opt].type == DRI_ENUM) {
|
||||
XML_FATAL1 ("valid attribute missing in option (mandatory for enums).");
|
||||
} else {
|
||||
cache->info[opt].nRanges = 0;
|
||||
cache->info[opt].ranges = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Handler for start element events. */
|
||||
static void optInfoStartElem (void *userData, const XML_Char *name,
|
||||
const XML_Char **attr) {
|
||||
struct OptInfoData *data = (struct OptInfoData *)userData;
|
||||
enum OptInfoElem elem = bsearchStr (name, OptInfoElems, OI_COUNT);
|
||||
switch (elem) {
|
||||
case OI_DRIINFO:
|
||||
if (data->inDriInfo)
|
||||
XML_FATAL1 ("nested <driinfo> elements.");
|
||||
if (attr[0])
|
||||
XML_FATAL1 ("attributes specified on <driinfo> element.");
|
||||
data->inDriInfo = GL_TRUE;
|
||||
break;
|
||||
case OI_SECTION:
|
||||
if (!data->inDriInfo)
|
||||
XML_FATAL1 ("<section> must be inside <driinfo>.");
|
||||
if (data->inSection)
|
||||
XML_FATAL1 ("nested <section> elements.");
|
||||
if (attr[0])
|
||||
XML_FATAL1 ("attributes specified on <section> element.");
|
||||
data->inSection = GL_TRUE;
|
||||
break;
|
||||
case OI_DESCRIPTION:
|
||||
if (!data->inSection && !data->inOption)
|
||||
XML_FATAL1 ("<description> must be inside <description> or <option.");
|
||||
if (data->inDesc)
|
||||
XML_FATAL1 ("nested <description> elements.");
|
||||
data->inDesc = GL_TRUE;
|
||||
parseDescAttr (data, attr);
|
||||
break;
|
||||
case OI_OPTION:
|
||||
if (!data->inSection)
|
||||
XML_FATAL1 ("<option> must be inside <section>.");
|
||||
if (data->inDesc)
|
||||
XML_FATAL1 ("<option> nested in <description> element.");
|
||||
if (data->inOption)
|
||||
XML_FATAL1 ("nested <option> elements.");
|
||||
data->inOption = GL_TRUE;
|
||||
parseOptInfoAttr (data, attr);
|
||||
break;
|
||||
case OI_ENUM:
|
||||
if (!(data->inOption && data->inDesc))
|
||||
XML_FATAL1 ("<enum> must be inside <option> and <description>.");
|
||||
if (data->inEnum)
|
||||
XML_FATAL1 ("nested <enum> elements.");
|
||||
data->inEnum = GL_TRUE;
|
||||
parseEnumAttr (data, attr);
|
||||
break;
|
||||
default:
|
||||
XML_FATAL ("unknown element: %s.", name);
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Handler for end element events. */
|
||||
static void optInfoEndElem (void *userData, const XML_Char *name) {
|
||||
struct OptInfoData *data = (struct OptInfoData *)userData;
|
||||
enum OptInfoElem elem = bsearchStr (name, OptInfoElems, OI_COUNT);
|
||||
switch (elem) {
|
||||
case OI_DRIINFO:
|
||||
data->inDriInfo = GL_FALSE;
|
||||
break;
|
||||
case OI_SECTION:
|
||||
data->inSection = GL_FALSE;
|
||||
break;
|
||||
case OI_DESCRIPTION:
|
||||
data->inDesc = GL_FALSE;
|
||||
break;
|
||||
case OI_OPTION:
|
||||
data->inOption = GL_FALSE;
|
||||
break;
|
||||
case OI_ENUM:
|
||||
data->inEnum = GL_FALSE;
|
||||
break;
|
||||
default:
|
||||
assert (0); /* should have been caught by StartElem */
|
||||
}
|
||||
}
|
||||
|
||||
void driParseOptionInfo (driOptionCache *info) {
|
||||
XML_Parser p;
|
||||
int status;
|
||||
struct OptInfoData userData;
|
||||
struct OptInfoData *data = &userData;
|
||||
GLuint nOptions;
|
||||
|
||||
/* determine hash table size and allocate memory */
|
||||
GLuint size, log2size;
|
||||
for (size = 1, log2size = 0; size < __driNConfigOptions*3/2;
|
||||
size <<= 1, ++log2size);
|
||||
info->tableSize = log2size;
|
||||
info->info = CALLOC (size * sizeof (driOptionInfo));
|
||||
info->values = CALLOC (size * sizeof (driOptionInfo));
|
||||
if (info->info == NULL || info->values == NULL) {
|
||||
fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__);
|
||||
abort();
|
||||
}
|
||||
|
||||
p = XML_ParserCreate ("UTF-8"); /* always UTF-8 */
|
||||
XML_SetElementHandler (p, optInfoStartElem, optInfoEndElem);
|
||||
XML_SetUserData (p, data);
|
||||
|
||||
userData.name = "__driConfigOptions";
|
||||
userData.parser = p;
|
||||
userData.cache = info;
|
||||
userData.inDriInfo = GL_FALSE;
|
||||
userData.inSection = GL_FALSE;
|
||||
userData.inDesc = GL_FALSE;
|
||||
userData.inOption = GL_FALSE;
|
||||
userData.inEnum = GL_FALSE;
|
||||
userData.curOption = -1;
|
||||
|
||||
status = XML_Parse (p, __driConfigOptions, strlen (__driConfigOptions), 1);
|
||||
if (!status)
|
||||
XML_FATAL ("%s.", XML_ErrorString(XML_GetErrorCode(p)));
|
||||
|
||||
XML_ParserFree (p);
|
||||
|
||||
/* Check if the actual number of options matches __driNConfigOptions.
|
||||
* A mismatch is not fatal (a hash table overflow would be) but we
|
||||
* want the driver developer's attention anyway. */
|
||||
nOptions = countOptions (info);
|
||||
if (nOptions != __driNConfigOptions) {
|
||||
fprintf (stderr,
|
||||
"Error: __driNConfigOptions (%u) does not match the actual number of options in\n"
|
||||
" __driConfigOptions (%u).\n",
|
||||
__driNConfigOptions, nOptions);
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Parser context for configuration files. */
|
||||
struct OptConfData {
|
||||
const char *name;
|
||||
XML_Parser parser;
|
||||
driOptionCache *cache;
|
||||
GLint screenNum;
|
||||
const char *driverName, *execName;
|
||||
GLuint ignoringDevice;
|
||||
GLuint ignoringApp;
|
||||
GLuint inDriConf;
|
||||
GLuint inDevice;
|
||||
GLuint inApp;
|
||||
GLuint inOption;
|
||||
};
|
||||
|
||||
/** \brief Elements in configuration files. */
|
||||
enum OptConfElem {
|
||||
OC_APPLICATION = 0, OC_DEVICE, OC_DRICONF, OC_OPTION, OC_COUNT
|
||||
};
|
||||
static const XML_Char *OptConfElems[] = {
|
||||
"application", "device", "driconf", "option"
|
||||
};
|
||||
|
||||
/** \brief Parse attributes of a device element. */
|
||||
static void parseDeviceAttr (struct OptConfData *data, const XML_Char **attr) {
|
||||
GLuint i;
|
||||
const XML_Char *driver = NULL, *screen = NULL;
|
||||
for (i = 0; attr[i]; i += 2) {
|
||||
if (!strcmp (attr[i], "driver")) driver = attr[i+1];
|
||||
else if (!strcmp (attr[i], "screen")) screen = attr[i+1];
|
||||
else XML_WARNING("unkown device attribute: %s.", attr[i]);
|
||||
}
|
||||
if (driver && strcmp (driver, data->driverName))
|
||||
data->ignoringDevice = data->inDevice;
|
||||
else if (screen) {
|
||||
driOptionValue screenNum;
|
||||
if (!parseValue (&screenNum, DRI_INT, screen))
|
||||
XML_WARNING("illegal screen number: %s.", screen);
|
||||
else if (screenNum._int != data->screenNum)
|
||||
data->ignoringDevice = data->inDevice;
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Parse attributes of an application element. */
|
||||
static void parseAppAttr (struct OptConfData *data, const XML_Char **attr) {
|
||||
GLuint i;
|
||||
const XML_Char *name = NULL, *exec = NULL;
|
||||
for (i = 0; attr[i]; i += 2) {
|
||||
if (!strcmp (attr[i], "name")) name = attr[i+1];
|
||||
else if (!strcmp (attr[i], "executable")) exec = attr[i+1];
|
||||
else XML_WARNING("unkown application attribute: %s.", attr[i]);
|
||||
}
|
||||
if (exec && strcmp (exec, data->execName))
|
||||
data->ignoringApp = data->inApp;
|
||||
}
|
||||
|
||||
/** \brief Parse attributes of an option element. */
|
||||
static void parseOptConfAttr (struct OptConfData *data, const XML_Char **attr) {
|
||||
GLuint i;
|
||||
const XML_Char *name = NULL, *value = NULL;
|
||||
for (i = 0; attr[i]; i += 2) {
|
||||
if (!strcmp (attr[i], "name")) name = attr[i+1];
|
||||
else if (!strcmp (attr[i], "value")) value = attr[i+1];
|
||||
else XML_WARNING("unkown option attribute: %s.", attr[i]);
|
||||
}
|
||||
if (!name) XML_WARNING1 ("name attribute missing in option.");
|
||||
if (!value) XML_WARNING1 ("value attribute missing in option.");
|
||||
if (name && value) {
|
||||
driOptionCache *cache = data->cache;
|
||||
GLuint opt = findOption (cache, name);
|
||||
if (cache->info[opt].name == NULL)
|
||||
XML_WARNING ("undefined option: %s.", name);
|
||||
else if (getenv (cache->info[opt].name))
|
||||
/* don't use XML_WARNING, we want the user to see this! */
|
||||
fprintf (stderr, "ATTENTION: option value of option %s ignored.\n",
|
||||
cache->info[opt].name);
|
||||
else if (!parseValue (&cache->values[opt], cache->info[opt].type, value))
|
||||
XML_WARNING ("illegal option value: %s.", value);
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Handler for start element events. */
|
||||
static void optConfStartElem (void *userData, const XML_Char *name,
|
||||
const XML_Char **attr) {
|
||||
struct OptConfData *data = (struct OptConfData *)userData;
|
||||
enum OptConfElem elem = bsearchStr (name, OptConfElems, OC_COUNT);
|
||||
switch (elem) {
|
||||
case OC_DRICONF:
|
||||
if (data->inDriConf)
|
||||
XML_WARNING1 ("nested <driconf> elements.");
|
||||
if (attr[0])
|
||||
XML_WARNING1 ("attributes specified on <driconf> element.");
|
||||
data->inDriConf++;
|
||||
break;
|
||||
case OC_DEVICE:
|
||||
if (!data->inDriConf)
|
||||
XML_WARNING1 ("<device> should be inside <driconf>.");
|
||||
if (data->inDevice)
|
||||
XML_WARNING1 ("nested <device> elements.");
|
||||
data->inDevice++;
|
||||
if (!data->ignoringDevice && !data->ignoringApp)
|
||||
parseDeviceAttr (data, attr);
|
||||
break;
|
||||
case OC_APPLICATION:
|
||||
if (!data->inDevice)
|
||||
XML_WARNING1 ("<application> should be inside <device>.");
|
||||
if (data->inApp)
|
||||
XML_WARNING1 ("nested <application> elements.");
|
||||
data->inApp++;
|
||||
if (!data->ignoringDevice && !data->ignoringApp)
|
||||
parseAppAttr (data, attr);
|
||||
break;
|
||||
case OC_OPTION:
|
||||
if (!data->inApp)
|
||||
XML_WARNING1 ("<option> should be inside <application>.");
|
||||
if (data->inOption)
|
||||
XML_WARNING1 ("nested <option> elements.");
|
||||
data->inOption++;
|
||||
if (!data->ignoringDevice && !data->ignoringApp)
|
||||
parseOptConfAttr (data, attr);
|
||||
break;
|
||||
default:
|
||||
XML_WARNING ("unknown element: %s.", name);
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Handler for end element events. */
|
||||
static void optConfEndElem (void *userData, const XML_Char *name) {
|
||||
struct OptConfData *data = (struct OptConfData *)userData;
|
||||
enum OptConfElem elem = bsearchStr (name, OptConfElems, OC_COUNT);
|
||||
switch (elem) {
|
||||
case OC_DRICONF:
|
||||
data->inDriConf--;
|
||||
break;
|
||||
case OC_DEVICE:
|
||||
if (data->inDevice-- == data->ignoringDevice)
|
||||
data->ignoringDevice = 0;
|
||||
break;
|
||||
case OC_APPLICATION:
|
||||
if (data->inApp-- == data->ignoringApp)
|
||||
data->ignoringApp = 0;
|
||||
break;
|
||||
case OC_OPTION:
|
||||
data->inOption--;
|
||||
break;
|
||||
default:
|
||||
/* unknown element, warning was produced on start tag */;
|
||||
}
|
||||
}
|
||||
|
||||
/** \brief Initialize an option cache based on info */
|
||||
static void initOptionCache (driOptionCache *cache, driOptionCache *info) {
|
||||
cache->info = info->info;
|
||||
cache->tableSize = info->tableSize;
|
||||
cache->values = MALLOC ((1<<info->tableSize) * sizeof (driOptionValue));
|
||||
if (cache->values == NULL) {
|
||||
fprintf (stderr, "%s: %d: out of memory.\n", __FILE__, __LINE__);
|
||||
abort();
|
||||
}
|
||||
memcpy (cache->values, info->values,
|
||||
(1<<info->tableSize) * sizeof (driOptionValue));
|
||||
}
|
||||
|
||||
/** \brief Parse the named configuration file */
|
||||
static void parseOneConfigFile (XML_Parser p) {
|
||||
#define BUF_SIZE 0x1000
|
||||
struct OptConfData *data = (struct OptConfData *)XML_GetUserData (p);
|
||||
int status;
|
||||
int fd;
|
||||
|
||||
if ((fd = open (data->name, O_RDONLY)) == -1) {
|
||||
__driUtilMessage ("Can't open configuration file %s: %s.",
|
||||
data->name, strerror (errno));
|
||||
return;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
int bytesRead;
|
||||
void *buffer = XML_GetBuffer (p, BUF_SIZE);
|
||||
if (!buffer) {
|
||||
__driUtilMessage ("Can't allocate parser buffer.");
|
||||
break;
|
||||
}
|
||||
bytesRead = read (fd, buffer, BUF_SIZE);
|
||||
if (bytesRead == -1) {
|
||||
__driUtilMessage ("Error reading from configuration file %s: %s.",
|
||||
data->name, strerror (errno));
|
||||
break;
|
||||
}
|
||||
status = XML_ParseBuffer (p, bytesRead, bytesRead == 0);
|
||||
if (!status) {
|
||||
XML_ERROR ("%s.", XML_ErrorString(XML_GetErrorCode(p)));
|
||||
break;
|
||||
}
|
||||
if (bytesRead == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
close (fd);
|
||||
#undef BUF_SIZE
|
||||
}
|
||||
|
||||
void driParseConfigFiles (driOptionCache *cache, driOptionCache *info,
|
||||
GLint screenNum, const char *driverName) {
|
||||
char *filenames[2] = {"/etc/drirc", NULL};
|
||||
char *home;
|
||||
GLuint i;
|
||||
struct OptConfData userData;
|
||||
|
||||
initOptionCache (cache, info);
|
||||
|
||||
userData.cache = cache;
|
||||
userData.screenNum = screenNum;
|
||||
userData.driverName = driverName;
|
||||
#ifndef _SOLO
|
||||
userData.execName = GET_PROGRAM_NAME();
|
||||
#else
|
||||
userData.execName = "Solo";
|
||||
#endif
|
||||
|
||||
if ((home = getenv ("HOME"))) {
|
||||
GLuint len = strlen (home);
|
||||
filenames[1] = MALLOC (len + 7+1);
|
||||
if (filenames[1] == NULL)
|
||||
__driUtilMessage ("Can't allocate memory for %s/.drirc.", home);
|
||||
else {
|
||||
memcpy (filenames[1], home, len);
|
||||
memcpy (filenames[1] + len, "/.drirc", 7+1);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; ++i) {
|
||||
XML_Parser p;
|
||||
if (filenames[i] == NULL)
|
||||
continue;
|
||||
|
||||
p = XML_ParserCreate (NULL); /* use encoding specified by file */
|
||||
XML_SetElementHandler (p, optConfStartElem, optConfEndElem);
|
||||
XML_SetUserData (p, &userData);
|
||||
userData.parser = p;
|
||||
userData.name = filenames[i];
|
||||
userData.ignoringDevice = 0;
|
||||
userData.ignoringApp = 0;
|
||||
userData.inDriConf = 0;
|
||||
userData.inDevice = 0;
|
||||
userData.inApp = 0;
|
||||
userData.inOption = 0;
|
||||
|
||||
parseOneConfigFile (p);
|
||||
XML_ParserFree (p);
|
||||
}
|
||||
|
||||
if (filenames[1])
|
||||
FREE (filenames[1]);
|
||||
}
|
||||
|
||||
void driDestroyOptionInfo (driOptionCache *info) {
|
||||
driDestroyOptionCache (info);
|
||||
if (info->info) {
|
||||
GLuint i, size = 1 << info->tableSize;
|
||||
for (i = 0; i < size; ++i) {
|
||||
if (info->info[i].name) {
|
||||
FREE (info->info[i].name);
|
||||
if (info->info[i].ranges)
|
||||
FREE (info->info[i].ranges);
|
||||
}
|
||||
}
|
||||
FREE (info->info);
|
||||
}
|
||||
}
|
||||
|
||||
void driDestroyOptionCache (driOptionCache *cache) {
|
||||
if (cache->values)
|
||||
FREE (cache->values);
|
||||
}
|
||||
|
||||
GLboolean driCheckOption (const driOptionCache *cache, const char *name,
|
||||
driOptionType type) {
|
||||
GLuint i = findOption (cache, name);
|
||||
return cache->info[i].name != NULL && cache->info[i].type == type;
|
||||
}
|
||||
|
||||
GLboolean driQueryOptionb (const driOptionCache *cache, const char *name) {
|
||||
GLuint i = findOption (cache, name);
|
||||
/* make sure the option is defined and has the correct type */
|
||||
assert (cache->info[i].name != NULL);
|
||||
assert (cache->info[i].type == DRI_BOOL);
|
||||
return cache->values[i]._bool;
|
||||
}
|
||||
|
||||
GLint driQueryOptioni (const driOptionCache *cache, const char *name) {
|
||||
GLuint i = findOption (cache, name);
|
||||
/* make sure the option is defined and has the correct type */
|
||||
assert (cache->info[i].name != NULL);
|
||||
assert (cache->info[i].type == DRI_INT || cache->info[i].type == DRI_ENUM);
|
||||
return cache->values[i]._int;
|
||||
}
|
||||
|
||||
GLfloat driQueryOptionf (const driOptionCache *cache, const char *name) {
|
||||
GLuint i = findOption (cache, name);
|
||||
/* make sure the option is defined and has the correct type */
|
||||
assert (cache->info[i].name != NULL);
|
||||
assert (cache->info[i].type == DRI_FLOAT);
|
||||
return cache->values[i]._float;
|
||||
}
|
125
src/mesa/drivers/dri/common/xmlconfig.h
Normal file
125
src/mesa/drivers/dri/common/xmlconfig.h
Normal file
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* XML DRI client-side driver configuration
|
||||
* Copyright (C) 2003 Felix Kuehling
|
||||
*
|
||||
* 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
|
||||
* FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS 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 xmlconfig.h
|
||||
* \brief Driver-independent client-side part of the XML configuration
|
||||
* \author Felix Kuehling
|
||||
*/
|
||||
|
||||
#ifndef __XMLCONFIG_H
|
||||
#define __XMLCONFIG_H
|
||||
|
||||
/** \brief Option data types */
|
||||
typedef enum driOptionType {
|
||||
DRI_BOOL, DRI_ENUM, DRI_INT, DRI_FLOAT
|
||||
} driOptionType;
|
||||
|
||||
/** \brief Option value */
|
||||
typedef union driOptionValue {
|
||||
GLboolean _bool; /**< \brief Boolean */
|
||||
GLint _int; /**< \brief Integer or Enum */
|
||||
GLfloat _float; /**< \brief Floating-point */
|
||||
} driOptionValue;
|
||||
|
||||
/** \brief Single range of valid values
|
||||
*
|
||||
* For empty ranges (a single value) start == end */
|
||||
typedef struct driOptionRange {
|
||||
driOptionValue start; /**< \brief Start */
|
||||
driOptionValue end; /**< \brief End */
|
||||
} driOptionRange;
|
||||
|
||||
/** \brief Information about an option */
|
||||
typedef struct driOptionInfo {
|
||||
char *name; /**< \brief Name */
|
||||
driOptionType type; /**< \brief Type */
|
||||
driOptionRange *ranges; /**< \brief Array of ranges */
|
||||
GLuint nRanges; /**< \brief Number of ranges */
|
||||
} driOptionInfo;
|
||||
|
||||
/** \brief Option cache
|
||||
*
|
||||
* \li One in <driver>Screen caching option info and the default values
|
||||
* \li One in each <driver>Context with the actual values for that context */
|
||||
typedef struct driOptionCache {
|
||||
driOptionInfo *info;
|
||||
/**< \brief Array of option infos
|
||||
*
|
||||
* Points to the same array in the screen and all contexts */
|
||||
driOptionValue *values;
|
||||
/**< \brief Array of option values
|
||||
*
|
||||
* \li Default values in screen
|
||||
* \li Actual values in contexts
|
||||
*/
|
||||
GLuint tableSize;
|
||||
/**< \brief Size of the arrays
|
||||
*
|
||||
* Depending on the hash function this may differ from __driNConfigOptions.
|
||||
* In the current implementation it's not actually a size but log2(size).
|
||||
* The value is the same in the screen and all contexts. */
|
||||
} driOptionCache;
|
||||
|
||||
/** \brief XML document describing available options
|
||||
*
|
||||
* This must be defined in a driver-specific soure file. xmlpool.h
|
||||
* defines helper macros and common options. */
|
||||
extern const char __driConfigOptions[];
|
||||
/** \brief The number of options supported by a driver
|
||||
*
|
||||
* This is used to choose an appropriate hash table size. So any value
|
||||
* larger than the actual number of options will work. */
|
||||
extern const GLuint __driNConfigOptions;
|
||||
|
||||
/** \brief Parse XML option info from __driConfigOptions
|
||||
*
|
||||
* To be called in <driver>CreateScreen */
|
||||
void driParseOptionInfo (driOptionCache *info);
|
||||
/** \brief Initialize option cache from info and parse configuration files
|
||||
*
|
||||
* To be called in <driver>CreateContext. screenNum and driverName select
|
||||
* device sections. */
|
||||
void driParseConfigFiles (driOptionCache *cache, driOptionCache *info,
|
||||
GLint screenNum, const char *driverName);
|
||||
/** \brief Destroy option info
|
||||
*
|
||||
* To be called in <driver>DestroyScreen */
|
||||
void driDestroyOptionInfo (driOptionCache *info);
|
||||
/** \brief Destroy option cache
|
||||
*
|
||||
* To be called in <driver>DestroyContext */
|
||||
void driDestroyOptionCache (driOptionCache *cache);
|
||||
|
||||
/** \brief Check if there exists a certain option */
|
||||
GLboolean driCheckOption (const driOptionCache *cache, const char *name,
|
||||
driOptionType type);
|
||||
|
||||
/** \brief Query a boolean option value */
|
||||
GLboolean driQueryOptionb (const driOptionCache *cache, const char *name);
|
||||
/** \brief Query an integer option value */
|
||||
GLint driQueryOptioni (const driOptionCache *cache, const char *name);
|
||||
/** \brief Query a floating-point option value */
|
||||
GLfloat driQueryOptionf (const driOptionCache *cache, const char *name);
|
||||
|
||||
#endif
|
203
src/mesa/drivers/dri/common/xmlpool.h
Normal file
203
src/mesa/drivers/dri/common/xmlpool.h
Normal file
@@ -0,0 +1,203 @@
|
||||
/* -*- mode:C; coding: mult-utf-8-unix -*-
|
||||
*
|
||||
* !!! Important: This file is encoded in UTF-8 !!!
|
||||
*
|
||||
* Note (Emacs): You need Mule. In Debian the package is called
|
||||
* mule-ucs.
|
||||
*
|
||||
* Note (Emacs): You may have to enable multibyte characters in the
|
||||
* Mule customization group or by setting
|
||||
* default-enable-multibyte-characters to t in your .emacs:
|
||||
*/
|
||||
/*
|
||||
* XML DRI client-side driver configuration
|
||||
* Copyright (C) 2003 Felix Kuehling
|
||||
*
|
||||
* 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
|
||||
* FELIX KUEHLING, OR ANY OTHER CONTRIBUTORS 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 xmlpool.h
|
||||
* \brief Pool of common options
|
||||
* \author Felix Kuehling
|
||||
*
|
||||
* This file defines macros that can be used to construct driConfigOptions
|
||||
* in the drivers.
|
||||
*/
|
||||
|
||||
#ifndef __XMLPOOL_H
|
||||
#define __XMLPOOL_H
|
||||
|
||||
/*
|
||||
* generic macros
|
||||
*/
|
||||
|
||||
/** \brief Begin __driConfigOptions */
|
||||
#define DRI_CONF_BEGIN \
|
||||
"<driinfo>\n"
|
||||
|
||||
/** \brief End __driConfigOptions */
|
||||
#define DRI_CONF_END \
|
||||
"</driinfo>\n"
|
||||
|
||||
/** \brief Begin a section of related options */
|
||||
#define DRI_CONF_SECTION_BEGIN \
|
||||
"<section>\n"
|
||||
|
||||
/** \brief End a section of related options */
|
||||
#define DRI_CONF_SECTION_END \
|
||||
"</section>\n"
|
||||
|
||||
/** \brief Begin an option definition */
|
||||
#define DRI_CONF_OPT_BEGIN(name,type,def) \
|
||||
"<option name=\""#name"\" type=\""#type"\" default=\""#def"\">\n"
|
||||
|
||||
/** \brief Begin an option definition with restrictions on valid values */
|
||||
#define DRI_CONF_OPT_BEGIN_V(name,type,def,valid) \
|
||||
"<option name=\""#name"\" type=\""#type"\" default=\""#def"\" valid=\""valid"\">\n"
|
||||
|
||||
/** \brief End an option description */
|
||||
#define DRI_CONF_OPT_END \
|
||||
"</option>\n"
|
||||
|
||||
/** \brief A verbal description in a specified language (empty version) */
|
||||
#define DRI_CONF_DESC(lang,text) \
|
||||
"<description lang=\""#lang"\" text=\""text"\"/>\n"
|
||||
|
||||
/** \brief A verbal description in a specified language */
|
||||
#define DRI_CONF_DESC_BEGIN(lang,text) \
|
||||
"<description lang=\""#lang"\" text=\""text"\">\n"
|
||||
|
||||
/** \brief End a description */
|
||||
#define DRI_CONF_DESC_END \
|
||||
"</description>\n"
|
||||
|
||||
/** \brief A verbal description of an enum value */
|
||||
#define DRI_CONF_ENUM(value,text) \
|
||||
"<enum value=\""#value"\" text=\""text"\"/>\n"
|
||||
|
||||
/*
|
||||
* predefined option sections and options with multi-lingual descriptions
|
||||
*/
|
||||
|
||||
/** \brief Debugging options */
|
||||
#define DRI_CONF_SECTION_DEBUG \
|
||||
DRI_CONF_SECTION_BEGIN \
|
||||
DRI_CONF_DESC(en,"Debugging") \
|
||||
DRI_CONF_DESC(de,"Fehlersuche")
|
||||
|
||||
#define DRI_CONF_NO_RAST(def) \
|
||||
DRI_CONF_OPT_BEGIN(no_rast,bool,def) \
|
||||
DRI_CONF_DESC(en,"Disable 3D acceleration") \
|
||||
DRI_CONF_DESC(de,"3D-Beschleunigung abschalten") \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
#define DRI_CONF_PERFORMANCE_BOXES(def) \
|
||||
DRI_CONF_OPT_BEGIN(performance_boxes,bool,def) \
|
||||
DRI_CONF_DESC(en,"Show performance boxes") \
|
||||
DRI_CONF_DESC(de,"Zeige Performanceboxen") \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
#define DRI_CONF_DEBUG_DMA(def) \
|
||||
DRI_CONF_OPT_BEGIN(debug_dma,bool,def) \
|
||||
DRI_CONF_DESC(en,"Debug DMA buffers") \
|
||||
DRI_CONF_DESC(de,"DMA Puffer debuggen") \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
|
||||
/** \brief Texture-related options */
|
||||
#define DRI_CONF_SECTION_QUALITY \
|
||||
DRI_CONF_SECTION_BEGIN \
|
||||
DRI_CONF_DESC(en,"Image Quality") \
|
||||
DRI_CONF_DESC(de,"Bildqualität")
|
||||
|
||||
#define DRI_CONF_PREFERRED_BPT(def,valid) \
|
||||
DRI_CONF_OPT_BEGIN_V(preferred_bpt,enum,def,valid) \
|
||||
DRI_CONF_DESC_BEGIN(en,"Preferred texture color depth") \
|
||||
DRI_CONF_ENUM(0,"Same as frame buffer") \
|
||||
DRI_CONF_DESC_END \
|
||||
DRI_CONF_DESC_BEGIN(de,"Bevorzugte Textur Farbtiefe") \
|
||||
DRI_CONF_ENUM(0,"So wie der Framebuffer") \
|
||||
DRI_CONF_DESC_END \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
/** \brief Performance-related options */
|
||||
#define DRI_CONF_SECTION_PERFORMANCE \
|
||||
DRI_CONF_SECTION_BEGIN \
|
||||
DRI_CONF_DESC(en,"Performance") \
|
||||
DRI_CONF_DESC(de,"Leistung")
|
||||
|
||||
#define DRI_CONF_TCL_SW 0
|
||||
#define DRI_CONF_TCL_PIPELINED 1
|
||||
#define DRI_CONF_TCL_VTXFMT 2
|
||||
#define DRI_CONF_TCL_CODEGEN 3
|
||||
#define DRI_CONF_TCL_MODE(def) \
|
||||
DRI_CONF_OPT_BEGIN_V(tcl_mode,enum,def,"0:3") \
|
||||
DRI_CONF_DESC_BEGIN(en,"TCL mode (Transformation, Clipping, Lighting)") \
|
||||
DRI_CONF_ENUM(0,"Software") \
|
||||
DRI_CONF_ENUM(1,"TCL stage in MESA pipeline") \
|
||||
DRI_CONF_ENUM(2,"Bypass MESA's pipeline") \
|
||||
DRI_CONF_ENUM(3,"Bypass MESA's pipeline with state-based code generation") \
|
||||
DRI_CONF_DESC_END \
|
||||
DRI_CONF_DESC_BEGIN(de,"TCL Modus (Transformation, Clipping, Licht)") \
|
||||
DRI_CONF_ENUM(0,"Software") \
|
||||
DRI_CONF_ENUM(1,"TCL Stufe in MESA Pipeline") \
|
||||
DRI_CONF_ENUM(2,"Umgehe MESA's Pipeline") \
|
||||
DRI_CONF_ENUM(3,"Umgehe MESA's Pipeline mit zustandsbasierter Codegenerierung") \
|
||||
DRI_CONF_DESC_END \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
#define DRI_CONF_FTHROTTLE_BUSY 0
|
||||
#define DRI_CONF_FTHROTTLE_USLEEPS 1
|
||||
#define DRI_CONF_FTHROTTLE_IRQS 2
|
||||
#define DRI_CONF_FTHROTTLE_MODE(def) \
|
||||
DRI_CONF_OPT_BEGIN_V(fthrottle_mode,enum,def,"0:2") \
|
||||
DRI_CONF_DESC_BEGIN(en,"Frame throttling") \
|
||||
DRI_CONF_ENUM(0,"Busy waiting") \
|
||||
DRI_CONF_ENUM(1,"Usleeps") \
|
||||
DRI_CONF_ENUM(2,"Software interrupts") \
|
||||
DRI_CONF_DESC_END \
|
||||
DRI_CONF_DESC_BEGIN(de,"Framethrottling") \
|
||||
DRI_CONF_ENUM(0,"Aktives Warten") \
|
||||
DRI_CONF_ENUM(1,"Usleeps") \
|
||||
DRI_CONF_ENUM(2,"Sortware Interrutps") \
|
||||
DRI_CONF_DESC_END \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
#define DRI_CONF_VBLANK_NEVER 0
|
||||
#define DRI_CONF_VBLANK_DEF_INTERVAL_0 1
|
||||
#define DRI_CONF_VBLANK_DEF_INTERVAL_1 2
|
||||
#define DRI_CONF_VBLANK_ALWAYS_SYNC 3
|
||||
#define DRI_CONF_VBLANK_MODE(def) \
|
||||
DRI_CONF_OPT_BEGIN_V(vblank_mode,enum,def,"0:3") \
|
||||
DRI_CONF_DESC_BEGIN(en,"Synchronization with vertical refresh (swap intervals)") \
|
||||
DRI_CONF_ENUM(0,"Never, FPS rulez!") \
|
||||
DRI_CONF_ENUM(1,"Application preference, default interval 0") \
|
||||
DRI_CONF_ENUM(2,"Application preference, default interval 1") \
|
||||
DRI_CONF_ENUM(3,"Application preference, always synchronize with refresh") \
|
||||
DRI_CONF_DESC_END \
|
||||
DRI_CONF_DESC_BEGIN(de,"Synchronisation mit dem vertikalen Bildaufbau (swap intervals)") \
|
||||
DRI_CONF_ENUM(0,"Niemals, immer die maximale Framerate") \
|
||||
DRI_CONF_ENUM(1,"Anwendung entscheidet, Standardinterval 0") \
|
||||
DRI_CONF_ENUM(2,"Anwendung entscheidet, Standardinterval 1") \
|
||||
DRI_CONF_ENUM(3,"Anwendung entscheidet, immer mit Bildaufbau synchronisieren") \
|
||||
DRI_CONF_DESC_END \
|
||||
DRI_CONF_OPT_END
|
||||
|
||||
#endif
|
@@ -1,4 +1,4 @@
|
||||
# $Id: Makefile.X11,v 1.2 2003/08/23 04:58:24 jonsmirl Exp $
|
||||
# $Id: Makefile.X11,v 1.2.2.1 2003/11/21 15:49:29 keithw Exp $
|
||||
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 5.0
|
||||
@@ -57,6 +57,10 @@ fb_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11
|
||||
rm -f $(TOP)/lib/fb_dri.so && \
|
||||
install fb_dri.so $(TOP)/lib/fb_dri.so
|
||||
|
||||
$(TOP)/lib/fb_dri.so: fb_dri.so
|
||||
rm -f $(TOP)/lib/fb_dri.so && \
|
||||
install fb_dri.so $(TOP)/lib/fb_dri.so
|
||||
|
||||
# Run 'make -f Makefile.X11 dep' to update the dependencies if you change
|
||||
# what's included by any source file.
|
||||
depend: $(C_SOURCES) $(ASM_SOURCES)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: fb_dri.c,v 1.2 2003/10/08 01:53:30 kendallb Exp $ */
|
||||
/* $Id: fb_dri.c,v 1.1.2.1 2003/11/21 15:49:29 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
|
123
src/mesa/drivers/dri/gamma/Makefile.X11
Normal file
123
src/mesa/drivers/dri/gamma/Makefile.X11
Normal file
@@ -0,0 +1,123 @@
|
||||
# $Id: Makefile.X11,v 1.2.2.1 2003/11/21 15:49:29 keithw Exp $
|
||||
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 5.0
|
||||
# Copyright (C) 1995-2002 Brian Paul
|
||||
|
||||
TOP = ../../../../..
|
||||
|
||||
default: linux-solo
|
||||
|
||||
SHARED_INCLUDES = $(INCLUDE_DIRS) -I. -I../common -Iserver
|
||||
MINIGLX_INCLUDES = -I$(TOP)/src/glx/mini
|
||||
|
||||
DEFINES += \
|
||||
-D_HAVE_SWRAST=1 \
|
||||
-D_HAVE_SWTNL=1 \
|
||||
-D_HAVE_SANITY=1 \
|
||||
-D_HAVE_CODEGEN=1 \
|
||||
-D_HAVE_LIGHTING=1 \
|
||||
-D_HAVE_TEXGEN=1 \
|
||||
-D_HAVE_USERCLIP=1 \
|
||||
-DGLX_DIRECT_RENDERING
|
||||
|
||||
# Not yet
|
||||
# MINIGLX_SOURCES = server/gamma_dri.c
|
||||
|
||||
DRIVER_SOURCES = \
|
||||
gamma_context.c \
|
||||
gamma_dd.c \
|
||||
gamma_inithw.c \
|
||||
gamma_lock.c \
|
||||
gamma_render.c \
|
||||
gamma_screen.c \
|
||||
gamma_span.c \
|
||||
gamma_state.c \
|
||||
gamma_tex.c \
|
||||
gamma_texmem.c \
|
||||
gamma_texstate.c \
|
||||
gamma_tris.c \
|
||||
gamma_vb.c \
|
||||
gamma_xmesa.c \
|
||||
../common/mm.c \
|
||||
../common/utils.c \
|
||||
../common/texmem.c \
|
||||
../common/vblank.c
|
||||
|
||||
INCLUDES = $(MINIGLX_INCLUDES) \
|
||||
$(SHARED_INCLUDES)
|
||||
|
||||
|
||||
C_SOURCES = $(DRIVER_SOURCES) \
|
||||
$(MINIGLX_SOURCES)
|
||||
|
||||
MESA_MODULES = $(TOP)/src/mesa/mesa.a
|
||||
|
||||
|
||||
ifeq ($(WINDOW_SYSTEM),dri)
|
||||
WINOBJ=$(MESABUILDDIR)/dri/dri.a
|
||||
WINLIB=
|
||||
else
|
||||
WINOBJ=
|
||||
WINLIB=-L$(MESA)/src/glx/mini
|
||||
endif
|
||||
|
||||
ASM_SOURCES =
|
||||
OBJECTS = $(C_SOURCES:.c=.o) \
|
||||
$(ASM_SOURCES:.S=.o)
|
||||
|
||||
### Include directories
|
||||
|
||||
INCLUDE_DIRS = \
|
||||
-I$(TOP)/include \
|
||||
-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/swrast \
|
||||
-I$(TOP)/src/mesa/swrast_setup
|
||||
|
||||
|
||||
##### RULES #####
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(SHARED_INCLUDES) $(MINIGLX_INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
|
||||
|
||||
.S.o:
|
||||
$(CC) -c $(SHARED_INCLUDES) $(MINIGLX_INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
|
||||
|
||||
|
||||
##### TARGETS #####
|
||||
|
||||
targets: depend gamma_dri.so
|
||||
|
||||
gamma_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11
|
||||
rm -f $@ && gcc -o $@ -shared $(OBJECTS) $(MESA_MODULES) $(WINOBJ) $(WINLIB) -lc $(GL_LIB_DEPS)
|
||||
rm -f $(TOP)/lib/gamma_dri.so && \
|
||||
install gamma_dri.so $(TOP)/lib/gamma_dri.so
|
||||
|
||||
$(TOP)/lib/gamma_dri.so: gamma_dri.so
|
||||
rm -f $(TOP)/lib/gamma_dri.so && \
|
||||
install gamma_dri.so $(TOP)/lib/gamma_dri.so
|
||||
|
||||
# Run 'make -f Makefile.X11 dep' to update the dependencies if you change
|
||||
# what's included by any source file.
|
||||
depend: $(C_SOURCES) $(ASM_SOURCES)
|
||||
makedepend -fdepend -Y $(SHARED_INCLUDES) $(MINIGLX_INCLUDES) \
|
||||
$(C_SOURCES) $(ASM_SOURCES)
|
||||
|
||||
|
||||
# Emacs tags
|
||||
tags:
|
||||
etags `find . -name \*.[ch]` `find ../include`
|
||||
|
||||
|
||||
# Remove .o and backup files
|
||||
clean:
|
||||
-rm -f *.o */*.o *~ *.o *~ *.so server/*.o
|
||||
|
||||
|
||||
include $(TOP)/Make-config
|
||||
|
||||
include depend
|
@@ -48,9 +48,9 @@
|
||||
#include "gamma_vb.h"
|
||||
#include "gamma_tris.h"
|
||||
|
||||
extern const struct gl_pipeline_stage _gamma_render_stage;
|
||||
extern const struct tnl_pipeline_stage _gamma_render_stage;
|
||||
|
||||
static const struct gl_pipeline_stage *gamma_pipeline[] = {
|
||||
static const struct tnl_pipeline_stage *gamma_pipeline[] = {
|
||||
&_tnl_vertex_transform_stage,
|
||||
&_tnl_normal_transform_stage,
|
||||
&_tnl_lighting_stage,
|
||||
|
@@ -46,18 +46,15 @@ static void gamma_emit( GLcontext *ctx, GLuint start, GLuint end)
|
||||
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
|
||||
GLfloat (*coord)[4];
|
||||
GLuint coord_stride;
|
||||
GLubyte (*col)[4];
|
||||
GLfloat (*col)[4];
|
||||
GLuint col_stride;
|
||||
int i;
|
||||
GLuint tc0_stride = 0;
|
||||
GLfloat (*tc0)[4] = 0;
|
||||
GLuint tc0_size = 0;
|
||||
|
||||
if (VB->ColorPtr[0]->Type != GL_UNSIGNED_BYTE)
|
||||
gamma_import_float_colors( ctx );
|
||||
|
||||
col = VB->ColorPtr[0]->Ptr;
|
||||
col_stride = VB->ColorPtr[0]->StrideB;
|
||||
col = VB->ColorPtr[0]->data;
|
||||
col_stride = VB->ColorPtr[0]->stride;
|
||||
|
||||
if (ctx->Texture.Unit[0]._ReallyEnabled) {
|
||||
tc0_stride = VB->TexCoordPtr[0]->stride;
|
||||
@@ -70,58 +67,8 @@ static void gamma_emit( GLcontext *ctx, GLuint start, GLuint end)
|
||||
coord_stride = VB->NdcPtr->stride;
|
||||
}
|
||||
|
||||
if (VB->importable_data) {
|
||||
if (start) {
|
||||
coord = (GLfloat (*)[4])((GLubyte *)coord + start * coord_stride);
|
||||
STRIDE_4UB(col, start * col_stride);
|
||||
if (ctx->Texture.Unit[0]._ReallyEnabled)
|
||||
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + start * tc0_stride);
|
||||
}
|
||||
|
||||
if (ctx->Texture.Unit[0]._ReallyEnabled && tc0_size == 4) {
|
||||
for (i=start; i < end; i++) {
|
||||
CHECK_DMA_BUFFER(gmesa, 9);
|
||||
WRITEF(gmesa->buf, Tq4, tc0[0][3]);
|
||||
WRITEF(gmesa->buf, Tr4, tc0[0][2]);
|
||||
WRITEF(gmesa->buf, Tt4, tc0[0][0]);
|
||||
WRITEF(gmesa->buf, Ts4, tc0[0][1]);
|
||||
WRITE(gmesa->buf, PackedColor4, *(CARD32*)col[0]);
|
||||
WRITEF(gmesa->buf, Vw, coord[0][3]);
|
||||
WRITEF(gmesa->buf, Vz, coord[0][2]);
|
||||
WRITEF(gmesa->buf, Vy, coord[0][1]);
|
||||
WRITEF(gmesa->buf, Vx4, coord[0][0]);
|
||||
STRIDE_4UB(col, col_stride);
|
||||
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride);
|
||||
coord = (GLfloat (*)[4])((GLubyte *)coord + coord_stride);
|
||||
}
|
||||
} else if (ctx->Texture.Unit[0]._ReallyEnabled && tc0_size == 2) {
|
||||
for (i=start; i < end; i++) {
|
||||
CHECK_DMA_BUFFER(gmesa, 7);
|
||||
WRITEF(gmesa->buf, Tt2, tc0[0][0]);
|
||||
WRITEF(gmesa->buf, Ts2, tc0[0][1]);
|
||||
WRITE(gmesa->buf, PackedColor4, *(CARD32*)col[0]);
|
||||
WRITEF(gmesa->buf, Vw, coord[0][3]);
|
||||
WRITEF(gmesa->buf, Vz, coord[0][2]);
|
||||
WRITEF(gmesa->buf, Vy, coord[0][1]);
|
||||
WRITEF(gmesa->buf, Vx4, coord[0][0]);
|
||||
STRIDE_4UB(col, col_stride);
|
||||
tc0 = (GLfloat (*)[4])((GLubyte *)tc0 + tc0_stride);
|
||||
coord = (GLfloat (*)[4])((GLubyte *)coord + coord_stride);
|
||||
}
|
||||
} else {
|
||||
for (i=start; i < end; i++) {
|
||||
CHECK_DMA_BUFFER(gmesa, 4);
|
||||
WRITE(gmesa->buf, PackedColor4, *(CARD32*)col[0]);
|
||||
WRITEF(gmesa->buf, Vz, coord[0][2]);
|
||||
WRITEF(gmesa->buf, Vy, coord[0][1]);
|
||||
WRITEF(gmesa->buf, Vx3, coord[0][0]);
|
||||
STRIDE_4UB(col, col_stride);
|
||||
coord = (GLfloat (*)[4])((GLubyte *)coord + coord_stride);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ctx->Texture.Unit[0]._ReallyEnabled && tc0_size == 4) {
|
||||
for (i=start; i < end; i++) {
|
||||
if (ctx->Texture.Unit[0]._ReallyEnabled && tc0_size == 4) {
|
||||
for (i=start; i < end; i++) {
|
||||
CHECK_DMA_BUFFER(gmesa, 9);
|
||||
WRITEF(gmesa->buf, Tq4, tc0[i][3]);
|
||||
WRITEF(gmesa->buf, Tr4, tc0[i][2]);
|
||||
@@ -132,9 +79,9 @@ static void gamma_emit( GLcontext *ctx, GLuint start, GLuint end)
|
||||
WRITEF(gmesa->buf, Vz, coord[i][2]);
|
||||
WRITEF(gmesa->buf, Vy, coord[i][1]);
|
||||
WRITEF(gmesa->buf, Vx4, coord[i][0]);
|
||||
}
|
||||
} else if (ctx->Texture.Unit[0]._ReallyEnabled && tc0_size == 2) {
|
||||
for (i=start; i < end; i++) {
|
||||
}
|
||||
} else if (ctx->Texture.Unit[0]._ReallyEnabled && tc0_size == 2) {
|
||||
for (i=start; i < end; i++) {
|
||||
CHECK_DMA_BUFFER(gmesa, 7);
|
||||
WRITEF(gmesa->buf, Tt2, tc0[i][0]);
|
||||
WRITEF(gmesa->buf, Ts2, tc0[i][1]);
|
||||
@@ -143,15 +90,14 @@ static void gamma_emit( GLcontext *ctx, GLuint start, GLuint end)
|
||||
WRITEF(gmesa->buf, Vz, coord[i][2]);
|
||||
WRITEF(gmesa->buf, Vy, coord[i][1]);
|
||||
WRITEF(gmesa->buf, Vx4, coord[i][0]);
|
||||
}
|
||||
} else {
|
||||
for (i=start; i < end; i++) {
|
||||
}
|
||||
} else {
|
||||
for (i=start; i < end; i++) {
|
||||
CHECK_DMA_BUFFER(gmesa, 4);
|
||||
WRITE(gmesa->buf, PackedColor4, *(CARD32*)col[i]);
|
||||
WRITEF(gmesa->buf, Vz, coord[i][2]);
|
||||
WRITEF(gmesa->buf, Vy, coord[i][1]);
|
||||
WRITEF(gmesa->buf, Vx3, coord[i][0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -178,7 +124,7 @@ static void VERT_FALLBACK( GLcontext *ctx,
|
||||
tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
|
||||
tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
|
||||
tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start, count, flags );
|
||||
GAMMA_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_CLIP;
|
||||
GAMMA_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_POS;
|
||||
}
|
||||
|
||||
static const GLuint hw_prim[GL_POLYGON+1] = {
|
||||
@@ -236,7 +182,7 @@ static __inline void gammaEndPrimitive( gammaContextPtr gmesa )
|
||||
|
||||
|
||||
static GLboolean gamma_run_render( GLcontext *ctx,
|
||||
struct gl_pipeline_stage *stage )
|
||||
struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
@@ -256,12 +202,16 @@ static GLboolean gamma_run_render( GLcontext *ctx,
|
||||
|
||||
tnl->Driver.Render.Start( ctx );
|
||||
|
||||
for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
|
||||
for (i = 0 ; i < VB->PrimitiveCount ; i++)
|
||||
{
|
||||
flags = VB->Primitive[i];
|
||||
length = VB->PrimitiveLength[i];
|
||||
if (length)
|
||||
tab[flags & PRIM_MODE_MASK]( ctx, i, i + length, flags );
|
||||
GLuint prim = VB->Primitive[i].mode;
|
||||
GLuint start = VB->Primitive[i].start;
|
||||
GLuint length = VB->Primitive[i].count;
|
||||
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
tab[prim & PRIM_MODE_MASK]( ctx, start, start + length, prim);
|
||||
}
|
||||
|
||||
tnl->Driver.Render.Finish( ctx );
|
||||
@@ -271,9 +221,9 @@ static GLboolean gamma_run_render( GLcontext *ctx,
|
||||
|
||||
|
||||
static void gamma_check_render( GLcontext *ctx,
|
||||
struct gl_pipeline_stage *stage )
|
||||
struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
GLuint inputs = VERT_BIT_CLIP | VERT_BIT_COLOR0;
|
||||
GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
|
||||
|
||||
if (ctx->RenderMode == GL_RENDER) {
|
||||
if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
|
||||
@@ -293,13 +243,13 @@ static void gamma_check_render( GLcontext *ctx,
|
||||
}
|
||||
|
||||
|
||||
static void dtr( struct gl_pipeline_stage *stage )
|
||||
static void dtr( struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
(void)stage;
|
||||
}
|
||||
|
||||
|
||||
const struct gl_pipeline_stage _gamma_render_stage =
|
||||
const struct tnl_pipeline_stage _gamma_render_stage =
|
||||
{
|
||||
"gamma render",
|
||||
(_DD_NEW_SEPARATE_SPECULAR |
|
||||
|
@@ -278,7 +278,7 @@ void gammaBuildVertices( GLcontext *ctx,
|
||||
if (!newinputs)
|
||||
return;
|
||||
|
||||
if (newinputs & VERT_BIT_CLIP) {
|
||||
if (newinputs & VERT_BIT_POS) {
|
||||
setup_tab[gmesa->SetupIndex].emit( ctx, start, count, v, stride );
|
||||
} else {
|
||||
GLuint ind = 0;
|
||||
|
@@ -66,7 +66,7 @@ gammaDestroyContext(__DRIcontextPrivate *driContextPriv)
|
||||
gmesa->glCtx->DriverCtx = NULL;
|
||||
_mesa_destroy_context(gmesa->glCtx);
|
||||
|
||||
Xfree(gmesa);
|
||||
FREE(gmesa);
|
||||
driContextPriv->driverPrivate = NULL;
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# $Id: Makefile.X11,v 1.1 2003/09/30 10:54:15 alanh Exp $
|
||||
# $Id: Makefile.X11,v 1.1.2.1 2003/11/21 15:49:29 keithw Exp $
|
||||
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 5.0
|
||||
@@ -94,6 +94,10 @@ i810_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11
|
||||
rm -f $(TOP)/lib/i810_dri.so && \
|
||||
install i810_dri.so $(TOP)/lib/i810_dri.so
|
||||
|
||||
$(TOP)/lib/i810_dri.so: i810_dri.so
|
||||
rm -f $(TOP)/lib/i810_dri.so && \
|
||||
install i810_dri.so $(TOP)/lib/i810_dri.so
|
||||
|
||||
# Run 'make -f Makefile.X11 dep' to update the dependencies if you change
|
||||
# what's included by any source file.
|
||||
depend: $(C_SOURCES) $(ASM_SOURCES)
|
||||
|
@@ -107,9 +107,9 @@ static const char * const card_extensions[] =
|
||||
NULL
|
||||
};
|
||||
|
||||
extern const struct gl_pipeline_stage _i810_render_stage;
|
||||
extern const struct tnl_pipeline_stage _i810_render_stage;
|
||||
|
||||
static const struct gl_pipeline_stage *i810_pipeline[] = {
|
||||
static const struct tnl_pipeline_stage *i810_pipeline[] = {
|
||||
&_tnl_vertex_transform_stage,
|
||||
&_tnl_normal_transform_stage,
|
||||
&_tnl_lighting_stage,
|
||||
|
@@ -105,7 +105,7 @@ static void VERT_FALLBACK( GLcontext *ctx,
|
||||
tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
|
||||
tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start,
|
||||
count, flags );
|
||||
I810_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_CLIP;
|
||||
I810_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_POS;
|
||||
}
|
||||
|
||||
|
||||
@@ -137,12 +137,12 @@ static void VERT_FALLBACK( GLcontext *ctx,
|
||||
|
||||
|
||||
static GLboolean i810_run_render( GLcontext *ctx,
|
||||
struct gl_pipeline_stage *stage )
|
||||
struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
i810ContextPtr imesa = I810_CONTEXT(ctx);
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &tnl->vb;
|
||||
GLuint i, length, flags = 0;
|
||||
GLuint i;
|
||||
|
||||
/* Don't handle clipping or indexed vertices.
|
||||
*/
|
||||
@@ -150,17 +150,21 @@ static GLboolean i810_run_render( GLcontext *ctx,
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
imesa->SetupNewInputs = VERT_BIT_CLIP;
|
||||
imesa->SetupNewInputs = VERT_BIT_POS;
|
||||
|
||||
tnl->Driver.Render.Start( ctx );
|
||||
|
||||
for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
|
||||
for (i = 0 ; i < VB->PrimitiveCount ; i++)
|
||||
{
|
||||
flags = VB->Primitive[i];
|
||||
length= VB->PrimitiveLength[i];
|
||||
if (length)
|
||||
i810_render_tab_verts[flags & PRIM_MODE_MASK]( ctx, i, i + length,
|
||||
flags );
|
||||
GLuint prim = VB->Primitive[i].mode;
|
||||
GLuint start = VB->Primitive[i].start;
|
||||
GLuint length = VB->Primitive[i].count;
|
||||
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
i810_render_tab_verts[prim & PRIM_MODE_MASK]( ctx, start, start + length,
|
||||
prim );
|
||||
}
|
||||
|
||||
tnl->Driver.Render.Finish( ctx );
|
||||
@@ -169,9 +173,9 @@ static GLboolean i810_run_render( GLcontext *ctx,
|
||||
}
|
||||
|
||||
|
||||
static void i810_check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
|
||||
static void i810_check_render( GLcontext *ctx, struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
GLuint inputs = VERT_BIT_CLIP | VERT_BIT_COLOR0;
|
||||
GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
|
||||
|
||||
if (ctx->RenderMode == GL_RENDER) {
|
||||
if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
|
||||
@@ -191,13 +195,13 @@ static void i810_check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
|
||||
}
|
||||
|
||||
|
||||
static void dtr( struct gl_pipeline_stage *stage )
|
||||
static void dtr( struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
(void)stage;
|
||||
}
|
||||
|
||||
|
||||
const struct gl_pipeline_stage _i810_render_stage =
|
||||
const struct tnl_pipeline_stage _i810_render_stage =
|
||||
{
|
||||
"i810 render",
|
||||
(_DD_NEW_SEPARATE_SPECULAR |
|
||||
|
@@ -34,6 +34,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
#include "glheader.h"
|
||||
#include "imports.h"
|
||||
#include "context.h"
|
||||
#include "matrix.h"
|
||||
#include "simple_list.h"
|
||||
@@ -68,12 +69,12 @@ static drmBufMapPtr i810_create_empty_buffers(void)
|
||||
{
|
||||
drmBufMapPtr retval;
|
||||
|
||||
retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap));
|
||||
retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap), 32);
|
||||
if(retval == NULL) return NULL;
|
||||
memset(retval, 0, sizeof(drmBufMap));
|
||||
retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I810_DMA_BUF_NR);
|
||||
retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I810_DMA_BUF_NR, 32);
|
||||
if(retval->list == NULL) {
|
||||
Xfree(retval);
|
||||
ALIGN_FREE(retval);
|
||||
return NULL;
|
||||
}
|
||||
memset(retval->list, 0, sizeof(drmBuf) * I810_DMA_BUF_NR);
|
||||
@@ -143,7 +144,7 @@ i810InitDriver(__DRIscreenPrivate *sPriv)
|
||||
i810Screen->bufs = i810_create_empty_buffers();
|
||||
if (i810Screen->bufs == NULL) {
|
||||
__driUtilMessage("i810InitDriver: i810_create_empty_buffers() failed");
|
||||
Xfree(i810Screen);
|
||||
FREE(i810Screen);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
@@ -154,7 +155,7 @@ i810InitDriver(__DRIscreenPrivate *sPriv)
|
||||
i810Screen->back.handle,
|
||||
i810Screen->back.size,
|
||||
(drmAddress *)&i810Screen->back.map) != 0) {
|
||||
Xfree(i810Screen);
|
||||
FREE(i810Screen);
|
||||
sPriv->private = NULL;
|
||||
__driUtilMessage("i810InitDriver: drmMap failed");
|
||||
return GL_FALSE;
|
||||
@@ -167,7 +168,7 @@ i810InitDriver(__DRIscreenPrivate *sPriv)
|
||||
i810Screen->depth.handle,
|
||||
i810Screen->depth.size,
|
||||
(drmAddress *)&i810Screen->depth.map) != 0) {
|
||||
Xfree(i810Screen);
|
||||
FREE(i810Screen);
|
||||
drmUnmap(i810Screen->back.map, i810Screen->back.size);
|
||||
sPriv->private = NULL;
|
||||
__driUtilMessage("i810InitDriver: drmMap (2) failed");
|
||||
@@ -181,7 +182,7 @@ i810InitDriver(__DRIscreenPrivate *sPriv)
|
||||
i810Screen->tex.handle,
|
||||
i810Screen->tex.size,
|
||||
(drmAddress *)&i810Screen->tex.map) != 0) {
|
||||
Xfree(i810Screen);
|
||||
FREE(i810Screen);
|
||||
drmUnmap(i810Screen->back.map, i810Screen->back.size);
|
||||
drmUnmap(i810Screen->depth.map, i810Screen->depth.size);
|
||||
sPriv->private = NULL;
|
||||
@@ -205,7 +206,7 @@ i810DestroyScreen(__DRIscreenPrivate *sPriv)
|
||||
drmUnmap(i810Screen->depth.map, i810Screen->depth.size);
|
||||
drmUnmap(i810Screen->tex.map, i810Screen->tex.size);
|
||||
|
||||
Xfree(i810Screen);
|
||||
FREE(i810Screen);
|
||||
sPriv->private = NULL;
|
||||
}
|
||||
|
||||
|
@@ -383,7 +383,7 @@ void i810BuildVertices( GLcontext *ctx,
|
||||
if (!newinputs)
|
||||
return;
|
||||
|
||||
if (newinputs & VERT_BIT_CLIP) {
|
||||
if (newinputs & VERT_BIT_POS) {
|
||||
setup_tab[imesa->SetupIndex].emit( ctx, start, count, v, stride );
|
||||
} else {
|
||||
GLuint ind = 0;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# $Id: Makefile.X11,v 1.2 2003/09/30 11:05:46 alanh Exp $
|
||||
# $Id: Makefile.X11,v 1.2.2.1 2003/11/21 15:49:29 keithw Exp $
|
||||
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 5.0
|
||||
@@ -95,6 +95,10 @@ i830_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11
|
||||
rm -f $(TOP)/lib/i830_dri.so && \
|
||||
install i830_dri.so $(TOP)/lib/i830_dri.so
|
||||
|
||||
$(TOP)/lib/i830_dri.so: i830_dri.so
|
||||
rm -f $(TOP)/lib/i830_dri.so && \
|
||||
install i830_dri.so $(TOP)/lib/i830_dri.so
|
||||
|
||||
# Run 'make -f Makefile.X11 dep' to update the dependencies if you change
|
||||
# what's included by any source file.
|
||||
depend: $(C_SOURCES) $(ASM_SOURCES)
|
||||
|
@@ -167,9 +167,9 @@ static const char * const card_extensions[] =
|
||||
};
|
||||
|
||||
|
||||
extern const struct gl_pipeline_stage _i830_render_stage;
|
||||
extern const struct tnl_pipeline_stage _i830_render_stage;
|
||||
|
||||
static const struct gl_pipeline_stage *i830_pipeline[] = {
|
||||
static const struct tnl_pipeline_stage *i830_pipeline[] = {
|
||||
&_tnl_vertex_transform_stage,
|
||||
&_tnl_normal_transform_stage,
|
||||
&_tnl_lighting_stage,
|
||||
|
@@ -122,7 +122,7 @@ static void VERT_FALLBACK( GLcontext *ctx,
|
||||
tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
|
||||
tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start,
|
||||
count, flags );
|
||||
I830_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_CLIP;
|
||||
I830_CONTEXT(ctx)->SetupNewInputs = VERT_BIT_POS;
|
||||
}
|
||||
|
||||
|
||||
@@ -159,24 +159,27 @@ static GLboolean choose_render( struct vertex_buffer *VB, int bufsz )
|
||||
int nr_rprims = 0;
|
||||
int nr_rverts = 0;
|
||||
int rprim = 0;
|
||||
int i = 0, length, flags = 0;
|
||||
int i;
|
||||
|
||||
|
||||
for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length) {
|
||||
flags = VB->Primitive[i];
|
||||
length = VB->PrimitiveLength[i];
|
||||
for (i = 0 ; i < VB->PrimitiveCount ; i++)
|
||||
{
|
||||
GLuint prim = VB->Primitive[i].mode;
|
||||
GLuint start = VB->Primitive[i].start;
|
||||
GLuint length = VB->Primitive[i].count;
|
||||
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
if (!hw_prim[flags & PRIM_MODE_MASK])
|
||||
if (!hw_prim[prim & PRIM_MODE_MASK])
|
||||
return GL_FALSE;
|
||||
|
||||
nr_prims++;
|
||||
nr_rverts += length * scale_prim[flags & PRIM_MODE_MASK];
|
||||
nr_rverts += length * scale_prim[prim & PRIM_MODE_MASK];
|
||||
|
||||
if (reduced_prim[flags&PRIM_MODE_MASK] != rprim) {
|
||||
if (reduced_prim[prim&PRIM_MODE_MASK] != rprim) {
|
||||
nr_rprims++;
|
||||
rprim = reduced_prim[flags&PRIM_MODE_MASK];
|
||||
rprim = reduced_prim[prim&PRIM_MODE_MASK];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,7 +195,7 @@ static GLboolean choose_render( struct vertex_buffer *VB, int bufsz )
|
||||
|
||||
|
||||
static GLboolean i830_run_render( GLcontext *ctx,
|
||||
struct gl_pipeline_stage *stage )
|
||||
struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
i830ContextPtr imesa = I830_CONTEXT(ctx);
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
@@ -205,16 +208,21 @@ static GLboolean i830_run_render( GLcontext *ctx,
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
imesa->SetupNewInputs = VERT_BIT_CLIP;
|
||||
imesa->SetupNewInputs = VERT_BIT_POS;
|
||||
|
||||
tnl->Driver.Render.Start( ctx );
|
||||
|
||||
for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length) {
|
||||
flags = VB->Primitive[i];
|
||||
length= VB->PrimitiveLength[i];
|
||||
if (length)
|
||||
i830_render_tab_verts[flags & PRIM_MODE_MASK]( ctx, i, i + length,
|
||||
flags );
|
||||
for (i = 0 ; i < VB->PrimitiveCount ; i++)
|
||||
{
|
||||
GLuint prim = VB->Primitive[i].mode;
|
||||
GLuint start = VB->Primitive[i].start;
|
||||
GLuint length = VB->Primitive[i].count;
|
||||
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
i830_render_tab_verts[prim & PRIM_MODE_MASK]( ctx, start, start + length,
|
||||
prim );
|
||||
}
|
||||
|
||||
tnl->Driver.Render.Finish( ctx );
|
||||
@@ -224,9 +232,9 @@ static GLboolean i830_run_render( GLcontext *ctx,
|
||||
|
||||
|
||||
static void i830_check_render( GLcontext *ctx,
|
||||
struct gl_pipeline_stage *stage )
|
||||
struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
GLuint inputs = VERT_BIT_CLIP | VERT_BIT_COLOR0;
|
||||
GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
|
||||
if (ctx->RenderMode == GL_RENDER) {
|
||||
if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
|
||||
inputs |= VERT_BIT_COLOR1;
|
||||
@@ -244,13 +252,13 @@ static void i830_check_render( GLcontext *ctx,
|
||||
stage->inputs = inputs;
|
||||
}
|
||||
|
||||
static void dtr( struct gl_pipeline_stage *stage )
|
||||
static void dtr( struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
(void)stage;
|
||||
}
|
||||
|
||||
|
||||
const struct gl_pipeline_stage _i830_render_stage =
|
||||
const struct tnl_pipeline_stage _i830_render_stage =
|
||||
{
|
||||
"i830 render",
|
||||
(_DD_NEW_SEPARATE_SPECULAR |
|
||||
|
@@ -57,7 +57,7 @@ static int i830_malloc_proxy_buf(drmBufMapPtr buffers)
|
||||
drmBufPtr buf;
|
||||
int i;
|
||||
|
||||
buffer = ALIGN_MALLOC(I830_DMA_BUF_SZ);
|
||||
buffer = ALIGN_MALLOC(I830_DMA_BUF_SZ, 32);
|
||||
if(buffer == NULL) return -1;
|
||||
for(i = 0; i < I830_DMA_BUF_NR; i++) {
|
||||
buf = &(buffers->list[i]);
|
||||
@@ -71,12 +71,12 @@ static drmBufMapPtr i830_create_empty_buffers(void)
|
||||
{
|
||||
drmBufMapPtr retval;
|
||||
|
||||
retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap));
|
||||
retval = (drmBufMapPtr)ALIGN_MALLOC(sizeof(drmBufMap), 32);
|
||||
if(retval == NULL) return NULL;
|
||||
memset(retval, 0, sizeof(drmBufMap));
|
||||
retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I830_DMA_BUF_NR);
|
||||
retval->list = (drmBufPtr)ALIGN_MALLOC(sizeof(drmBuf) * I830_DMA_BUF_NR, 32);
|
||||
if(retval->list == NULL) {
|
||||
Xfree(retval);
|
||||
FREE(retval);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -182,7 +182,7 @@ static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv)
|
||||
if(i830Screen->bufs == NULL) {
|
||||
fprintf(stderr,"\nERROR: Failed to create empty buffers in %s \n",
|
||||
__FUNCTION__);
|
||||
Xfree(i830Screen);
|
||||
FREE(i830Screen);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
@@ -203,7 +203,7 @@ static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv)
|
||||
(drmAddress *)&i830Screen->back.map) != 0) {
|
||||
fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n",
|
||||
__LINE__, __FUNCTION__, __FILE__);
|
||||
Xfree(i830Screen);
|
||||
FREE(i830Screen);
|
||||
sPriv->private = NULL;
|
||||
return GL_FALSE;
|
||||
}
|
||||
@@ -217,7 +217,7 @@ static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv)
|
||||
(drmAddress *)&i830Screen->depth.map) != 0) {
|
||||
fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n",
|
||||
__LINE__, __FUNCTION__, __FILE__);
|
||||
Xfree(i830Screen);
|
||||
FREE(i830Screen);
|
||||
drmUnmap(i830Screen->back.map, i830Screen->back.size);
|
||||
sPriv->private = NULL;
|
||||
return GL_FALSE;
|
||||
@@ -232,7 +232,7 @@ static GLboolean i830InitDriver(__DRIscreenPrivate *sPriv)
|
||||
(drmAddress *)&i830Screen->tex.map) != 0) {
|
||||
fprintf(stderr, "\nERROR: line %d, Function %s, File %s\n",
|
||||
__LINE__, __FUNCTION__, __FILE__);
|
||||
Xfree(i830Screen);
|
||||
FREE(i830Screen);
|
||||
drmUnmap(i830Screen->back.map, i830Screen->back.size);
|
||||
drmUnmap(i830Screen->depth.map, i830Screen->depth.size);
|
||||
sPriv->private = NULL;
|
||||
@@ -288,7 +288,7 @@ static void i830DestroyScreen(__DRIscreenPrivate *sPriv)
|
||||
drmUnmap(i830Screen->back.map, i830Screen->back.size);
|
||||
drmUnmap(i830Screen->depth.map, i830Screen->depth.size);
|
||||
drmUnmap(i830Screen->tex.map, i830Screen->tex.size);
|
||||
Xfree(i830Screen);
|
||||
FREE(i830Screen);
|
||||
sPriv->private = NULL;
|
||||
}
|
||||
|
||||
|
@@ -445,7 +445,7 @@ void i830BuildVertices( GLcontext *ctx,
|
||||
if (!newinputs)
|
||||
return;
|
||||
|
||||
if (newinputs & VERT_BIT_CLIP) {
|
||||
if (newinputs & VERT_BIT_POS) {
|
||||
setup_tab[imesa->SetupIndex].emit( ctx, start, count, v, stride );
|
||||
} else {
|
||||
GLuint ind = 0;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# $Id: Makefile.X11,v 1.3 2003/08/24 04:44:23 jonsmirl Exp $
|
||||
# $Id: Makefile.X11,v 1.3.2.1 2003/11/21 15:49:29 keithw Exp $
|
||||
|
||||
# Mesa 3-D graphics library
|
||||
# Version: 5.0
|
||||
@@ -31,7 +31,8 @@ DRIVER_SOURCES = mgadd.c \
|
||||
../common/mm.c \
|
||||
../common/utils.c \
|
||||
../common/texmem.c \
|
||||
../common/vblank.c
|
||||
../common/vblank.c \
|
||||
../common/xmlconfig.c
|
||||
|
||||
FULL_DRIVER_SOURCES = \
|
||||
mgapixel.c \
|
||||
@@ -39,6 +40,7 @@ FULL_DRIVER_SOURCES = \
|
||||
mgatex.c \
|
||||
mgatexmem.c \
|
||||
mga_texstate.c \
|
||||
mga_texcombine.c \
|
||||
mgavb.c \
|
||||
mga_xmesa.c
|
||||
|
||||
@@ -99,6 +101,10 @@ mga_dri.so: $(OBJECTS) $(MESA_MODULES) $(WINOBJ) Makefile.X11
|
||||
rm -f $(TOP)/lib/mga_dri.so && \
|
||||
install mga_dri.so $(TOP)/lib/mga_dri.so
|
||||
|
||||
$(TOP)/lib/mga_dri.so: mga_dri.so
|
||||
rm -f $(TOP)/lib/mga_dri.so && \
|
||||
install mga_dri.so $(TOP)/lib/mga_dri.so
|
||||
|
||||
# Run 'make -f Makefile.X11 dep' to update the dependencies if you change
|
||||
# what's included by any source file.
|
||||
depend: $(C_SOURCES) $(ASM_SOURCES)
|
||||
|
647
src/mesa/drivers/dri/mga/mga_texcombine.c
Normal file
647
src/mesa/drivers/dri/mga/mga_texcombine.c
Normal file
@@ -0,0 +1,647 @@
|
||||
/*
|
||||
* Copyright (c) 2003 Ville Syrjala
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Authors:
|
||||
* Ville Syrjala <syrjala@sci.fi>
|
||||
*/
|
||||
|
||||
#include "glheader.h"
|
||||
|
||||
#include "mgacontext.h"
|
||||
#include "mgatex.h"
|
||||
#include "mgaregs.h"
|
||||
|
||||
/*
|
||||
* GL_ARB_texture_env_combine
|
||||
* GL_EXT_texture_env_combine
|
||||
* GL_ARB_texture_env_crossbar
|
||||
* GL_ATI_texture_env_combine3
|
||||
*/
|
||||
|
||||
#define ARG_DISABLE 0xffffffff
|
||||
#define MGA_ARG1 0
|
||||
#define MGA_ARG2 1
|
||||
#define MGA_ALPHA 2
|
||||
|
||||
GLboolean mgaUpdateTextureEnvCombine( GLcontext *ctx, int unit )
|
||||
{
|
||||
mgaContextPtr mmesa = MGA_CONTEXT(ctx);
|
||||
const int source = mmesa->tmu_source[unit];
|
||||
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[source];
|
||||
GLuint *reg = ((GLuint *)&mmesa->setup.tdualstage0 + unit);
|
||||
GLuint numColorArgs = 0, numAlphaArgs = 0;
|
||||
GLuint arg1[3], arg2[3], alpha[3];
|
||||
int args[3];
|
||||
int i;
|
||||
|
||||
switch (texUnit->CombineModeRGB) {
|
||||
case GL_REPLACE:
|
||||
numColorArgs = 1;
|
||||
break;
|
||||
case GL_MODULATE:
|
||||
case GL_ADD:
|
||||
case GL_ADD_SIGNED:
|
||||
case GL_SUBTRACT:
|
||||
numColorArgs = 2;
|
||||
break;
|
||||
case GL_INTERPOLATE:
|
||||
case GL_MODULATE_ADD_ATI:
|
||||
case GL_MODULATE_SIGNED_ADD_ATI:
|
||||
case GL_MODULATE_SUBTRACT_ATI:
|
||||
numColorArgs = 3;
|
||||
break;
|
||||
default:
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
switch (texUnit->CombineModeA) {
|
||||
case GL_REPLACE:
|
||||
numAlphaArgs = 1;
|
||||
break;
|
||||
case GL_MODULATE:
|
||||
case GL_ADD:
|
||||
case GL_ADD_SIGNED:
|
||||
case GL_SUBTRACT:
|
||||
numAlphaArgs = 2;
|
||||
break;
|
||||
default:
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
/* Start fresh :) */
|
||||
*reg = 0;
|
||||
|
||||
/* COLOR */
|
||||
for (i = 0; i < 3; i++) {
|
||||
arg1[i] = 0;
|
||||
arg2[i] = 0;
|
||||
alpha[i] = 0;
|
||||
}
|
||||
|
||||
for (i = 0;i < numColorArgs; i++) {
|
||||
switch (texUnit->CombineSourceRGB[i]) {
|
||||
case GL_TEXTURE:
|
||||
arg1[i] |= 0;
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
alpha[i] |= TD0_color_alpha_currtex;
|
||||
break;
|
||||
case GL_TEXTURE0:
|
||||
if (source == 0) {
|
||||
arg1[i] |= 0;
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
alpha[i] |= TD0_color_alpha_currtex;
|
||||
} else {
|
||||
if (ctx->Texture._EnabledUnits != 0x03) {
|
||||
/* disable texturing */
|
||||
mmesa->setup.dwgctl &= DC_opcod_MASK;
|
||||
mmesa->setup.dwgctl |= DC_opcod_trap;
|
||||
mmesa->hw.alpha_sel = AC_alphasel_diffused;
|
||||
/* return GL_TRUE since we don't need a fallback */
|
||||
return GL_TRUE;
|
||||
}
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
alpha[i] |= TD0_color_alpha_prevtex;
|
||||
}
|
||||
break;
|
||||
case GL_TEXTURE1:
|
||||
if (source == 0) {
|
||||
if (ctx->Texture._EnabledUnits != 0x03) {
|
||||
/* disable texturing */
|
||||
mmesa->setup.dwgctl &= DC_opcod_MASK;
|
||||
mmesa->setup.dwgctl |= DC_opcod_trap;
|
||||
mmesa->hw.alpha_sel = AC_alphasel_diffused;
|
||||
/* return GL_TRUE since we don't need a fallback */
|
||||
return GL_TRUE;
|
||||
}
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
/* G400 specs (TDUALSTAGE0) */
|
||||
arg2[i] |= TD0_color_arg2_prevstage;
|
||||
alpha[i] |= TD0_color_alpha_prevstage;
|
||||
} else {
|
||||
arg1[i] |= 0;
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
alpha[i] |= TD0_color_alpha_currtex;
|
||||
}
|
||||
break;
|
||||
case GL_CONSTANT:
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
arg2[i] |= TD0_color_arg2_fcol;
|
||||
alpha[i] |= TD0_color_alpha_fcol;
|
||||
break;
|
||||
case GL_PRIMARY_COLOR:
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
/* G400 specs (TDUALSTAGE1) */
|
||||
if (unit == 0 || (mmesa->setup.tdualstage0 &
|
||||
((TD0_color_sel_mul & TD0_color_sel_add) |
|
||||
(TD0_alpha_sel_mul & TD0_alpha_sel_add)))) {
|
||||
arg2[i] |= TD0_color_arg2_diffuse;
|
||||
alpha[i] |= TD0_color_alpha_diffuse;
|
||||
} else {
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
alpha[i] |= ARG_DISABLE;
|
||||
}
|
||||
break;
|
||||
case GL_PREVIOUS:
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
if (unit == 0) {
|
||||
arg2[i] |= TD0_color_arg2_diffuse;
|
||||
alpha[i] |= TD0_color_alpha_diffuse;
|
||||
} else {
|
||||
arg2[i] |= TD0_color_arg2_prevstage;
|
||||
alpha[i] |= TD0_color_alpha_prevstage;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
switch (texUnit->CombineOperandRGB[i]) {
|
||||
case GL_SRC_COLOR:
|
||||
arg1[i] |= 0;
|
||||
arg2[i] |= 0;
|
||||
alpha[i] |= ARG_DISABLE;
|
||||
break;
|
||||
case GL_ONE_MINUS_SRC_COLOR:
|
||||
arg1[i] |= TD0_color_arg1_inv_enable;
|
||||
arg2[i] |= TD0_color_arg2_inv_enable;
|
||||
alpha[i] |= ARG_DISABLE;
|
||||
break;
|
||||
case GL_SRC_ALPHA:
|
||||
arg1[i] |= TD0_color_arg1_replicatealpha_enable;
|
||||
arg2[i] |= TD0_color_arg2_replicatealpha_enable;
|
||||
alpha[i] |= 0;
|
||||
break;
|
||||
case GL_ONE_MINUS_SRC_ALPHA:
|
||||
arg1[i] |= (TD0_color_arg1_replicatealpha_enable |
|
||||
TD0_color_arg1_inv_enable);
|
||||
arg2[i] |= (TD0_color_arg2_replicatealpha_enable |
|
||||
TD0_color_arg2_inv_enable);
|
||||
alpha[i] |= (TD0_color_alpha1inv_enable |
|
||||
TD0_color_alpha2inv_enable);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (texUnit->CombineModeRGB) {
|
||||
case GL_MODULATE_ADD_ATI:
|
||||
case GL_MODULATE_SIGNED_ADD_ATI:
|
||||
/* Special handling for ATI_texture_env_combine3.
|
||||
* If Arg1 == Arg0 or Arg1 == Arg2 we can use arg1 or arg2 as input for
|
||||
* both multiplier and adder.
|
||||
*/
|
||||
/* Arg1 == arg1 */
|
||||
if (arg1[1] == arg1[0]) {
|
||||
if ((arg1[1] | arg2[2]) != ARG_DISABLE) {
|
||||
*reg |= arg1[1] | arg2[2];
|
||||
args[0] = MGA_ARG1; args[1] = MGA_ARG1; args[2] = MGA_ARG2;
|
||||
break;
|
||||
} else
|
||||
if ((arg1[1] | alpha[2]) != ARG_DISABLE) {
|
||||
*reg |= arg1[1] | alpha[2];
|
||||
args[0] = MGA_ARG1; args[1] = MGA_ARG1; args[2] = MGA_ALPHA;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (arg1[1] == arg1[2]) {
|
||||
if ((arg1[1] | arg2[0]) != ARG_DISABLE) {
|
||||
*reg |= arg1[1] | arg2[0];
|
||||
args[0] = MGA_ARG2; args[1] = MGA_ARG1; args[2] = MGA_ARG1;
|
||||
break;
|
||||
} else
|
||||
if ((arg1[1] | alpha[0]) != ARG_DISABLE) {
|
||||
*reg |= arg1[1] | alpha[0];
|
||||
args[0] = MGA_ALPHA; args[1] = MGA_ARG1; args[2] = MGA_ARG1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* fallthrough */
|
||||
case GL_MODULATE_SUBTRACT_ATI:
|
||||
/* Arg1 == arg2 */
|
||||
if (arg2[1] == arg2[0]) {
|
||||
if ((arg2[1] | arg1[2]) != ARG_DISABLE) {
|
||||
*reg |= arg2[1] | arg1[2];
|
||||
args[0] = MGA_ARG2; args[1] = MGA_ARG2; args[2] = MGA_ARG1;
|
||||
break;
|
||||
} else
|
||||
if ((arg2[1] | alpha[2]) != ARG_DISABLE) {
|
||||
*reg |= arg2[1] | alpha[2];
|
||||
args[0] = MGA_ARG2; args[1] = MGA_ARG2; args[2] = MGA_ALPHA;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (arg2[1] == arg2[2]) {
|
||||
if ((arg2[1] | arg1[0]) != ARG_DISABLE) {
|
||||
*reg |= arg2[1] | arg1[0];
|
||||
args[0] = MGA_ARG1; args[1] = MGA_ARG2; args[2] = MGA_ARG2;
|
||||
break;
|
||||
} else
|
||||
if ((arg2[1] | alpha[0]) != ARG_DISABLE) {
|
||||
*reg |= arg2[1] | alpha[0];
|
||||
args[0] = MGA_ALPHA; args[1] = MGA_ARG2; args[2] = MGA_ARG2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* fallthrough */
|
||||
default:
|
||||
/* Find working combo of arg1, arg2 and alpha.
|
||||
*
|
||||
* Keep the Arg0 != alpha cases first since there's
|
||||
* no way to get alpha out by itself (GL_REPLACE).
|
||||
*
|
||||
* Keep the Arg2 == alpha cases first because only alpha has the
|
||||
* capabilities to function as Arg2 (GL_INTERPOLATE). Also good for
|
||||
* GL_ADD, GL_ADD_SIGNED, GL_SUBTRACT since we can't get alpha to the
|
||||
* adder.
|
||||
*
|
||||
* Keep the Arg1 == alpha cases last for GL_MODULATE_ADD_ATI,
|
||||
* GL_MODULATE_SIGNED_ADD_ATI. Again because we can't get alpha to the
|
||||
* adder.
|
||||
*
|
||||
* GL_MODULATE_SUBTRACT_ATI needs special treatment since it requires
|
||||
* that Arg1 == arg2. This requirement clashes with those of other modes.
|
||||
*/
|
||||
if ((arg1[0] | arg2[1] | alpha[2]) != ARG_DISABLE) {
|
||||
*reg |= arg1[0] | arg2[1] | alpha[2];
|
||||
args[0] = MGA_ARG1; args[1] = MGA_ARG2; args[2] = MGA_ALPHA;
|
||||
} else
|
||||
if ((arg1[1] | arg2[0] | alpha[2]) != ARG_DISABLE &&
|
||||
texUnit->CombineModeRGB != GL_MODULATE_SUBTRACT_ATI) {
|
||||
*reg |= arg1[1] | arg2[0] | alpha[2];
|
||||
args[0] = MGA_ARG2; args[1] = MGA_ARG1; args[2] = MGA_ALPHA;
|
||||
} else
|
||||
if ((arg1[1] | arg2[2] | alpha[0]) != ARG_DISABLE &&
|
||||
texUnit->CombineModeRGB != GL_MODULATE_SUBTRACT_ATI) {
|
||||
*reg |= arg1[1] | arg2[2] | alpha[0];
|
||||
args[0] = MGA_ALPHA; args[1] = MGA_ARG1; args[2] = MGA_ARG2;
|
||||
} else
|
||||
if ((arg1[2] | arg2[1] | alpha[0]) != ARG_DISABLE) {
|
||||
*reg |= arg1[2] | arg2[1] | alpha[0];
|
||||
args[0] = MGA_ALPHA; args[1] = MGA_ARG2; args[2] = MGA_ARG1;
|
||||
} else
|
||||
if ((arg1[0] | arg2[2] | alpha[1]) != ARG_DISABLE) {
|
||||
*reg |= arg1[0] | arg2[2] | alpha[1];
|
||||
args[0] = MGA_ARG1; args[1] = MGA_ALPHA; args[2] = MGA_ARG2;
|
||||
} else
|
||||
if ((arg1[2] | arg2[0] | alpha[1]) != ARG_DISABLE) {
|
||||
*reg |= arg1[2] | arg2[0] | alpha[1];
|
||||
args[0] = MGA_ARG2; args[1] = MGA_ALPHA; args[2] = MGA_ARG1;
|
||||
} else {
|
||||
/* nothing suitable */
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
switch (texUnit->CombineModeRGB) {
|
||||
case GL_REPLACE:
|
||||
if (texUnit->CombineScaleShiftRGB) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (args[0] == MGA_ARG1) {
|
||||
*reg |= TD0_color_sel_arg1;
|
||||
} else if (args[0] == MGA_ARG2) {
|
||||
*reg |= TD0_color_sel_arg2;
|
||||
} else if (args[0] == MGA_ALPHA) {
|
||||
/* Can't get alpha out by itself */
|
||||
return GL_FALSE;
|
||||
}
|
||||
break;
|
||||
case GL_MODULATE:
|
||||
if (texUnit->CombineScaleShiftRGB == 1) {
|
||||
*reg |= TD0_color_modbright_2x;
|
||||
} else if (texUnit->CombineScaleShiftRGB == 2) {
|
||||
*reg |= TD0_color_modbright_4x;
|
||||
}
|
||||
|
||||
*reg |= TD0_color_sel_mul;
|
||||
|
||||
if (args[0] == MGA_ALPHA || args[1] == MGA_ALPHA) {
|
||||
if (args[0] == MGA_ARG1 || args[1] == MGA_ARG1) {
|
||||
*reg |= TD0_color_arg2mul_alpha2;
|
||||
} else if (args[0] == MGA_ARG2 || args[1] == MGA_ARG2) {
|
||||
*reg |= TD0_color_arg1mul_alpha1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_ADD_SIGNED:
|
||||
*reg |= TD0_color_addbias_enable;
|
||||
/* fallthrough */
|
||||
case GL_ADD:
|
||||
if (args[0] == MGA_ALPHA || args[1] == MGA_ALPHA){
|
||||
/* Can't get alpha to the adder */
|
||||
return GL_FALSE;
|
||||
}
|
||||
if (texUnit->CombineScaleShiftRGB == 1) {
|
||||
*reg |= TD0_color_add2x_enable;
|
||||
} else if (texUnit->CombineScaleShiftRGB == 2) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
*reg |= (TD0_color_add_add |
|
||||
TD0_color_sel_add);
|
||||
break;
|
||||
case GL_INTERPOLATE:
|
||||
if (args[2] != MGA_ALPHA) {
|
||||
/* Only alpha can function as Arg2 */
|
||||
return GL_FALSE;
|
||||
}
|
||||
if (texUnit->CombineScaleShiftRGB == 1) {
|
||||
*reg |= TD0_color_add2x_enable;
|
||||
} else if (texUnit->CombineScaleShiftRGB == 2) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
*reg |= (TD0_color_arg1mul_alpha1 |
|
||||
TD0_color_blend_enable |
|
||||
TD0_color_arg1add_mulout |
|
||||
TD0_color_arg2add_mulout |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add);
|
||||
|
||||
/* Have to do this with xor since GL_ONE_MINUS_SRC_ALPHA may have
|
||||
* already touched this bit.
|
||||
*/
|
||||
*reg ^= TD0_color_alpha1inv_enable;
|
||||
|
||||
if (args[0] == MGA_ARG2) {
|
||||
/* Swap arguments */
|
||||
*reg ^= (TD0_color_arg1mul_alpha1 |
|
||||
TD0_color_arg2mul_alpha2 |
|
||||
TD0_color_alpha1inv_enable |
|
||||
TD0_color_alpha2inv_enable);
|
||||
}
|
||||
|
||||
if (ctx->Texture._EnabledUnits != 0x03) {
|
||||
/* Linear blending mode needs dualtex enabled */
|
||||
*(reg+1) = (TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2);
|
||||
mmesa->dualtex_env = GL_TRUE;
|
||||
}
|
||||
break;
|
||||
case GL_SUBTRACT:
|
||||
if (args[0] == MGA_ALPHA || args[1] == MGA_ALPHA) {
|
||||
/* Can't get alpha to the adder */
|
||||
return GL_FALSE;
|
||||
}
|
||||
if (texUnit->CombineScaleShiftRGB == 1) {
|
||||
*reg |= TD0_color_add2x_enable;
|
||||
} else if (texUnit->CombineScaleShiftRGB == 2) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
*reg |= (TD0_color_add_sub |
|
||||
TD0_color_sel_add);
|
||||
|
||||
if (args[0] == MGA_ARG2) {
|
||||
/* Swap arguments */
|
||||
*reg ^= (TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_inv_enable);
|
||||
}
|
||||
break;
|
||||
case GL_MODULATE_SIGNED_ADD_ATI:
|
||||
*reg |= TD0_color_addbias_enable;
|
||||
/* fallthrough */
|
||||
case GL_MODULATE_ADD_ATI:
|
||||
if (args[1] == MGA_ALPHA) {
|
||||
/* Can't get alpha to the adder */
|
||||
return GL_FALSE;
|
||||
}
|
||||
if (texUnit->CombineScaleShiftRGB == 1) {
|
||||
*reg |= TD0_color_add2x_enable;
|
||||
} else if (texUnit->CombineScaleShiftRGB == 2) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
*reg |= (TD0_color_add_add |
|
||||
TD0_color_sel_add);
|
||||
|
||||
if (args[1] == args[0] || args[1] == args[2]) {
|
||||
*reg |= TD0_color_arg1add_mulout;
|
||||
if (args[0] == MGA_ALPHA || args[2] == MGA_ALPHA)
|
||||
*reg |= TD0_color_arg1mul_alpha1;
|
||||
|
||||
if (args[1] == MGA_ARG1) {
|
||||
/* Swap adder arguments */
|
||||
*reg ^= (TD0_color_arg1add_mulout |
|
||||
TD0_color_arg2add_mulout);
|
||||
if (args[0] == MGA_ALPHA || args[2] == MGA_ALPHA) {
|
||||
/* Swap multiplier arguments */
|
||||
*reg ^= (TD0_color_arg1mul_alpha1 |
|
||||
TD0_color_arg2mul_alpha2);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
*reg |= (TD0_color_arg2mul_alpha2 |
|
||||
TD0_color_arg1add_mulout);
|
||||
|
||||
if (args[1] == MGA_ARG1) {
|
||||
/* Swap arguments */
|
||||
*reg ^= (TD0_color_arg1mul_alpha1 |
|
||||
TD0_color_arg2mul_alpha2 |
|
||||
TD0_color_arg1add_mulout |
|
||||
TD0_color_arg2add_mulout);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_MODULATE_SUBTRACT_ATI:
|
||||
if (args[1] != MGA_ARG2) {
|
||||
/* Can't swap arguments */
|
||||
return GL_FALSE;
|
||||
}
|
||||
if (texUnit->CombineScaleShiftRGB == 1) {
|
||||
*reg |= TD0_color_add2x_enable;
|
||||
} else if (texUnit->CombineScaleShiftRGB == 2) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
*reg |= (TD0_color_add_sub |
|
||||
TD0_color_sel_add);
|
||||
|
||||
if (args[1] == args[0] || args[1] == args[2]) {
|
||||
*reg |= TD0_color_arg1add_mulout;
|
||||
if (args[0] == MGA_ALPHA || args[2] == MGA_ALPHA)
|
||||
*reg |= TD0_color_arg1mul_alpha1;
|
||||
} else {
|
||||
*reg |= (TD0_color_arg2mul_alpha2 |
|
||||
TD0_color_arg1add_mulout);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/* ALPHA */
|
||||
for (i = 0; i < 2; i++) {
|
||||
arg1[i] = 0;
|
||||
arg2[i] = 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < numAlphaArgs; i++) {
|
||||
switch (texUnit->CombineSourceA[i]) {
|
||||
case GL_TEXTURE:
|
||||
arg1[i] |= 0;
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
break;
|
||||
case GL_TEXTURE0:
|
||||
if (source == 0) {
|
||||
arg1[i] |= 0;
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
} else {
|
||||
if (ctx->Texture._EnabledUnits != 0x03) {
|
||||
/* disable texturing */
|
||||
mmesa->setup.dwgctl &= DC_opcod_MASK;
|
||||
mmesa->setup.dwgctl |= DC_opcod_trap;
|
||||
mmesa->hw.alpha_sel = AC_alphasel_diffused;
|
||||
/* return GL_TRUE since we don't need a fallback */
|
||||
return GL_TRUE;
|
||||
}
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
arg2[i] |= TD0_alpha_arg2_prevtex;
|
||||
}
|
||||
break;
|
||||
case GL_TEXTURE1:
|
||||
if (source == 0) {
|
||||
if (ctx->Texture._EnabledUnits != 0x03) {
|
||||
/* disable texturing */
|
||||
mmesa->setup.dwgctl &= DC_opcod_MASK;
|
||||
mmesa->setup.dwgctl |= DC_opcod_trap;
|
||||
mmesa->hw.alpha_sel = AC_alphasel_diffused;
|
||||
/* return GL_TRUE since we don't need a fallback */
|
||||
return GL_TRUE;
|
||||
}
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
/* G400 specs (TDUALSTAGE0) */
|
||||
arg2[i] |= TD0_alpha_arg2_prevstage;
|
||||
} else {
|
||||
arg1[i] |= 0;
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
}
|
||||
break;
|
||||
case GL_CONSTANT:
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
arg2[i] |= TD0_alpha_arg2_fcol;
|
||||
break;
|
||||
case GL_PRIMARY_COLOR:
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
/* G400 specs (TDUALSTAGE1) */
|
||||
if (unit == 0 || (mmesa->setup.tdualstage0 &
|
||||
((TD0_color_sel_mul & TD0_color_sel_add) |
|
||||
(TD0_alpha_sel_mul & TD0_alpha_sel_add)))) {
|
||||
arg2[i] |= TD0_alpha_arg2_diffuse;
|
||||
} else {
|
||||
arg2[i] |= ARG_DISABLE;
|
||||
}
|
||||
break;
|
||||
case GL_PREVIOUS:
|
||||
arg1[i] |= ARG_DISABLE;
|
||||
if (unit == 0) {
|
||||
arg2[i] |= TD0_alpha_arg2_diffuse;
|
||||
} else {
|
||||
arg2[i] |= TD0_alpha_arg2_prevstage;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
switch (texUnit->CombineOperandA[i]) {
|
||||
case GL_SRC_ALPHA:
|
||||
arg1[i] |= 0;
|
||||
arg2[i] |= 0;
|
||||
break;
|
||||
case GL_ONE_MINUS_SRC_ALPHA:
|
||||
arg1[i] |= TD0_alpha_arg1_inv_enable;
|
||||
arg2[i] |= TD0_alpha_arg2_inv_enable;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Find a working combo of arg1 and arg2 */
|
||||
if ((arg1[0] | arg2[1]) != ARG_DISABLE) {
|
||||
*reg |= arg1[0] | arg2[1];
|
||||
args[0] = MGA_ARG1; args[1] = MGA_ARG2;
|
||||
} else
|
||||
if ((arg1[1] | arg2[0]) != ARG_DISABLE) {
|
||||
*reg |= arg1[1] | arg2[0];
|
||||
args[0] = MGA_ARG2; args[1] = MGA_ARG1;
|
||||
} else {
|
||||
/* nothing suitable */
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
switch (texUnit->CombineModeA) {
|
||||
case GL_REPLACE:
|
||||
if (texUnit->CombineScaleShiftA) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (args[0] == MGA_ARG1){
|
||||
*reg |= TD0_alpha_sel_arg1;
|
||||
} else if (args[0] == MGA_ARG2) {
|
||||
*reg |= TD0_alpha_sel_arg2;
|
||||
}
|
||||
break;
|
||||
case GL_MODULATE:
|
||||
if (texUnit->CombineScaleShiftA == 1) {
|
||||
*reg |= TD0_alpha_modbright_2x;
|
||||
} else if (texUnit->CombineScaleShiftA == 2) {
|
||||
*reg |= TD0_alpha_modbright_4x;
|
||||
}
|
||||
|
||||
*reg |= TD0_alpha_sel_mul;
|
||||
break;
|
||||
case GL_ADD_SIGNED:
|
||||
*reg |= TD0_alpha_addbias_enable;
|
||||
/* fallthrough */
|
||||
case GL_ADD:
|
||||
if (texUnit->CombineScaleShiftA == 1) {
|
||||
*reg |= TD0_alpha_add2x_enable;
|
||||
} else if (texUnit->CombineScaleShiftA == 2) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
*reg |= (TD0_alpha_add_enable |
|
||||
TD0_alpha_sel_add);
|
||||
break;
|
||||
case GL_SUBTRACT:
|
||||
if (texUnit->CombineScaleShiftA == 1) {
|
||||
*reg |= TD0_alpha_add2x_enable;
|
||||
} else if (texUnit->CombineScaleShiftA == 2) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
*reg |= (TD0_alpha_add_disable |
|
||||
TD0_alpha_sel_add);
|
||||
|
||||
if (args[0] == MGA_ARG2) {
|
||||
/* Swap arguments */
|
||||
*reg ^= (TD0_alpha_arg1_inv_enable |
|
||||
TD0_alpha_arg2_inv_enable);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
@@ -52,6 +52,8 @@ static const unsigned TMC_tformat[ TMC_nr_tformat ] =
|
||||
[MESA_FORMAT_RGB565] = TMC_tformat_tw16 | TMC_takey_1 | TMC_tamask_0,
|
||||
[MESA_FORMAT_ARGB4444] = TMC_tformat_tw12 | TMC_takey_1 | TMC_tamask_0,
|
||||
[MESA_FORMAT_ARGB1555] = TMC_tformat_tw15 | TMC_takey_1 | TMC_tamask_0,
|
||||
[MESA_FORMAT_AL88] = TMC_tformat_tw8al | TMC_takey_1 | TMC_tamask_0,
|
||||
[MESA_FORMAT_I8] = TMC_tformat_tw8a | TMC_takey_1 | TMC_tamask_0,
|
||||
[MESA_FORMAT_CI8] = TMC_tformat_tw8 | TMC_takey_1 | TMC_tamask_0,
|
||||
[MESA_FORMAT_YCBCR] = TMC_tformat_tw422uyvy | TMC_takey_1 | TMC_tamask_0,
|
||||
[MESA_FORMAT_YCBCR_REV] = TMC_tformat_tw422 | TMC_takey_1 | TMC_tamask_0,
|
||||
@@ -67,7 +69,7 @@ mgaSetTexImages( mgaContextPtr mmesa,
|
||||
GLint totalSize;
|
||||
GLint width, height;
|
||||
GLint i;
|
||||
GLint firstLevel, lastLevel, numLevels;
|
||||
GLint numLevels;
|
||||
GLint log2Width, log2Height;
|
||||
GLuint txformat = 0;
|
||||
GLint ofs;
|
||||
@@ -81,6 +83,8 @@ mgaSetTexImages( mgaContextPtr mmesa,
|
||||
case MESA_FORMAT_RGB565: txformat = TMC_tformat_tw16; break;
|
||||
case MESA_FORMAT_ARGB4444: txformat = TMC_tformat_tw12; break;
|
||||
case MESA_FORMAT_ARGB1555: txformat = TMC_tformat_tw15; break;
|
||||
case MESA_FORMAT_AL88: txformat = TMC_tformat_tw8al; break;
|
||||
case MESA_FORMAT_I8: txformat = TMC_tformat_tw8a; break;
|
||||
case MESA_FORMAT_CI8: txformat = TMC_tformat_tw8; break;
|
||||
case MESA_FORMAT_YCBCR: txformat = TMC_tformat_tw422uyvy; break;
|
||||
case MESA_FORMAT_YCBCR_REV: txformat = TMC_tformat_tw422; break;
|
||||
@@ -101,39 +105,21 @@ mgaSetTexImages( mgaContextPtr mmesa,
|
||||
|
||||
#endif /* MGA_USE_TABLE_FOR_FORMAT */
|
||||
|
||||
if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) {
|
||||
/* GL_NEAREST and GL_LINEAR only care about GL_TEXTURE_BASE_LEVEL.
|
||||
*/
|
||||
driCalculateTextureFirstLastLevel( (driTextureObject *) t );
|
||||
log2Width = tObj->Image[t->base.firstLevel]->WidthLog2;
|
||||
log2Height = tObj->Image[t->base.firstLevel]->HeightLog2;
|
||||
|
||||
firstLevel = lastLevel = tObj->BaseLevel;
|
||||
} else {
|
||||
/* Compute which mipmap levels we really want to send to the hardware.
|
||||
* This depends on the base image size, GL_TEXTURE_MIN_LOD,
|
||||
* GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL.
|
||||
* Yes, this looks overly complicated, but it's all needed.
|
||||
*/
|
||||
width = tObj->Image[t->base.firstLevel]->Width;
|
||||
height = tObj->Image[t->base.firstLevel]->Height;
|
||||
|
||||
firstLevel = tObj->BaseLevel + (GLint)(tObj->MinLod + 0.5);
|
||||
firstLevel = MAX2(firstLevel, tObj->BaseLevel);
|
||||
lastLevel = tObj->BaseLevel + (GLint)(tObj->MaxLod + 0.5);
|
||||
lastLevel = MAX2(lastLevel, tObj->BaseLevel);
|
||||
lastLevel = MIN2(lastLevel, tObj->BaseLevel + baseImage->MaxLog2);
|
||||
lastLevel = MIN2(lastLevel, tObj->MaxLevel);
|
||||
lastLevel = MAX2(firstLevel, lastLevel); /* need at least one level */
|
||||
}
|
||||
|
||||
log2Width = tObj->Image[firstLevel]->WidthLog2;
|
||||
log2Height = tObj->Image[firstLevel]->HeightLog2;
|
||||
width = tObj->Image[firstLevel]->Width;
|
||||
height = tObj->Image[firstLevel]->Height;
|
||||
|
||||
numLevels = MIN2( lastLevel - firstLevel + 1,
|
||||
numLevels = MIN2( t->base.lastLevel - t->base.firstLevel + 1,
|
||||
MGA_IS_G200(mmesa) ? G200_TEX_MAXLEVELS : G400_TEX_MAXLEVELS);
|
||||
|
||||
|
||||
totalSize = 0;
|
||||
for ( i = 0 ; i < numLevels ; i++ ) {
|
||||
const struct gl_texture_image * const texImage = tObj->Image[i+firstLevel];
|
||||
const struct gl_texture_image * const texImage =
|
||||
tObj->Image[ i + t->base.firstLevel ];
|
||||
|
||||
if ( (texImage == NULL)
|
||||
|| ((i != 0)
|
||||
@@ -149,13 +135,9 @@ mgaSetTexImages( mgaContextPtr mmesa,
|
||||
baseImage->TexFormat->TexelBytes) + 31) & ~31;
|
||||
}
|
||||
|
||||
numLevels = i;
|
||||
lastLevel = firstLevel + numLevels - 1;
|
||||
|
||||
/* save these values */
|
||||
t->base.firstLevel = firstLevel;
|
||||
t->base.lastLevel = lastLevel;
|
||||
|
||||
numLevels = i;
|
||||
t->base.lastLevel = t->base.firstLevel + numLevels - 1;
|
||||
t->base.totalSize = totalSize;
|
||||
|
||||
/* setup hardware register values */
|
||||
@@ -225,7 +207,7 @@ static void mgaUpdateTextureEnvG200( GLcontext *ctx, GLuint unit )
|
||||
t->setup.texctl2 |= TMC_decalblend_enable;
|
||||
break;
|
||||
case GL_BLEND:
|
||||
FALLBACK( ctx, MGA_FALLBACK_TEXTURE, GL_TRUE );
|
||||
t->texenv_fallback = GL_TRUE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -251,12 +233,124 @@ static const GLuint g400_color_combine[][MGA_MAX_COMBFUNC] =
|
||||
(0),
|
||||
|
||||
/* GL_REPLACE
|
||||
* Cv = Cs
|
||||
* Av = Af
|
||||
*/
|
||||
(TD0_color_sel_arg1 |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2 ),
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_MODULATE
|
||||
* Cv = Cf Cs
|
||||
* Av = Af
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_DECAL
|
||||
* Cv = Cs
|
||||
* Av = Af
|
||||
*/
|
||||
(TD0_color_sel_arg1 |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_BLEND (Cc=0.0)
|
||||
* Cv = Cf ( 1 - Cs )
|
||||
* Av = Af
|
||||
*/
|
||||
(TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_ADD
|
||||
* Cv = Cf + Cs
|
||||
* Av = Af
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2),
|
||||
},
|
||||
|
||||
/* Unit 1:
|
||||
*/
|
||||
{
|
||||
/* Disable combiner stage
|
||||
*/
|
||||
(0),
|
||||
|
||||
/* GL_REPLACE
|
||||
* Cv = Cs
|
||||
* Av = Ap
|
||||
*/
|
||||
(TD0_color_sel_arg1 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_MODULATE
|
||||
* Cv = Cp Cs
|
||||
* Av = Ap
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_DECAL
|
||||
* Cv = Cs
|
||||
* Av = Ap
|
||||
*/
|
||||
(TD0_color_sel_arg1 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_BLEND (Cc=0.0)
|
||||
* Cv = Cp ( 1 - Cs )
|
||||
* Av = Ap
|
||||
*/
|
||||
(TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_ADD
|
||||
* Cv = Cp + Cs
|
||||
* Av = Ap
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2),
|
||||
},
|
||||
};
|
||||
|
||||
static const GLuint g400_color_alpha_combine[][MGA_MAX_COMBFUNC] =
|
||||
{
|
||||
/* Unit 0:
|
||||
*/
|
||||
{
|
||||
/* Disable combiner stage
|
||||
*/
|
||||
(0),
|
||||
|
||||
/* GL_REPLACE
|
||||
* Cv = Cs
|
||||
* Av = As
|
||||
*/
|
||||
(TD0_color_sel_arg1 |
|
||||
TD0_alpha_sel_arg1),
|
||||
|
||||
/* GL_MODULATE
|
||||
* Cv = Cf Cs
|
||||
* Av = Af As
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
@@ -264,16 +358,35 @@ static const GLuint g400_color_combine[][MGA_MAX_COMBFUNC] =
|
||||
TD0_alpha_sel_mul),
|
||||
|
||||
/* GL_DECAL
|
||||
* tmp = Cf ( 1 - As )
|
||||
* Cv = tmp + Cs As
|
||||
* Av = Af
|
||||
*/
|
||||
(TD0_color_sel_arg1 |
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_alpha_currtex |
|
||||
TD0_color_alpha1inv_enable |
|
||||
TD0_color_arg1mul_alpha1 |
|
||||
TD0_color_blend_enable |
|
||||
TD0_color_arg1add_mulout |
|
||||
TD0_color_arg2add_mulout |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_BLEND
|
||||
/* GL_BLEND (Cc=0.0)
|
||||
* Cv = Cf ( 1 - Cs )
|
||||
* Av = Af As
|
||||
*/
|
||||
(0),
|
||||
(TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul),
|
||||
|
||||
/* GL_ADD
|
||||
* Cv = Cf + Cs
|
||||
* Av = Af As
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_add_add |
|
||||
@@ -290,33 +403,53 @@ static const GLuint g400_color_combine[][MGA_MAX_COMBFUNC] =
|
||||
(0),
|
||||
|
||||
/* GL_REPLACE
|
||||
* Cv = Cs
|
||||
* Av = As
|
||||
*/
|
||||
(TD0_color_sel_arg1 |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2 ),
|
||||
TD0_alpha_sel_arg1),
|
||||
|
||||
/* GL_MODULATE
|
||||
* Cv = Cp Cs
|
||||
* Av = Ap As
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_alpha_prevstage |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_mul),
|
||||
|
||||
/* GL_DECAL
|
||||
*/
|
||||
(TD0_color_sel_arg1 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2 ),
|
||||
|
||||
/* GL_BLEND
|
||||
*/
|
||||
(0),
|
||||
|
||||
/* GL_ADD
|
||||
* tmp = Cp ( 1 - As )
|
||||
* Cv = tmp + Cs As
|
||||
* Av = Ap
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_alpha_currtex |
|
||||
TD0_color_alpha1inv_enable |
|
||||
TD0_color_arg1mul_alpha1 |
|
||||
TD0_color_blend_enable |
|
||||
TD0_color_arg1add_mulout |
|
||||
TD0_color_arg2add_mulout |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_BLEND (Cc=0.0)
|
||||
* Cv = Cp ( 1 - Cs )
|
||||
* Av = Ap As
|
||||
*/
|
||||
(TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_mul),
|
||||
|
||||
/* GL_ADD
|
||||
* Cv = Cp + Cs
|
||||
* Av = Ap As
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_alpha_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
@@ -334,20 +467,25 @@ static const GLuint g400_alpha_combine[][MGA_MAX_COMBFUNC] =
|
||||
(0),
|
||||
|
||||
/* GL_REPLACE
|
||||
*/
|
||||
(TD0_color_sel_arg2 |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_alpha_sel_arg1 ),
|
||||
|
||||
/* GL_MODULATE
|
||||
* FIXME: Is this correct?
|
||||
* Cv = Cf
|
||||
* Av = As
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_sel_arg1),
|
||||
|
||||
/* GL_MODULATE
|
||||
* Cv = Cf
|
||||
* Av = Af As
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul),
|
||||
|
||||
/* GL_DECAL
|
||||
/* GL_DECAL (undefined)
|
||||
* Cv = Cf
|
||||
* Av = Af
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_arg2 |
|
||||
@@ -355,16 +493,20 @@ static const GLuint g400_alpha_combine[][MGA_MAX_COMBFUNC] =
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_BLEND
|
||||
* Cv = Cf
|
||||
* Av = Af As
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul),
|
||||
|
||||
/* GL_ADD
|
||||
* Cv = Cf
|
||||
* Av = Af As
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul),
|
||||
},
|
||||
@@ -377,21 +519,25 @@ static const GLuint g400_alpha_combine[][MGA_MAX_COMBFUNC] =
|
||||
(0),
|
||||
|
||||
/* GL_REPLACE
|
||||
*/
|
||||
(TD0_color_sel_arg2 |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_alpha_sel_arg1 ),
|
||||
|
||||
/* GL_MODULATE
|
||||
* FIXME: Is this correct?
|
||||
* Cv = Cp
|
||||
* Av = As
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_alpha_prevstage |
|
||||
TD0_color_sel_mul |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_sel_arg1),
|
||||
|
||||
/* GL_MODULATE
|
||||
* Cv = Cp
|
||||
* Av = Ap As
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_mul),
|
||||
|
||||
/* GL_DECAL
|
||||
/* GL_DECAL (undefined)
|
||||
* Cv = Cp
|
||||
* Av = Ap
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_arg2 |
|
||||
@@ -399,16 +545,20 @@ static const GLuint g400_alpha_combine[][MGA_MAX_COMBFUNC] =
|
||||
TD0_alpha_sel_arg2),
|
||||
|
||||
/* GL_BLEND
|
||||
* Cv = Cp
|
||||
* Av = Ap As
|
||||
*/
|
||||
(TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_mul),
|
||||
|
||||
/* GL_ADD
|
||||
* Cv = Cp
|
||||
* Av = Ap As
|
||||
*/
|
||||
(TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_mul |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_mul),
|
||||
},
|
||||
@@ -421,143 +571,236 @@ static void mgaUpdateTextureEnvG400( GLcontext *ctx, GLuint unit )
|
||||
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[source];
|
||||
const struct gl_texture_object *tObj = texUnit->_Current;
|
||||
GLuint *reg = ((GLuint *)&mmesa->setup.tdualstage0 + unit);
|
||||
mgaTextureObjectPtr t;
|
||||
GLenum format;
|
||||
|
||||
if ( tObj != ctx->Texture.Unit[source].Current2D || !tObj )
|
||||
if ( !tObj ||
|
||||
(tObj != ctx->Texture.Unit[source].Current2D &&
|
||||
tObj != ctx->Texture.Unit[source].CurrentRect) )
|
||||
return;
|
||||
|
||||
format = tObj->Image[tObj->BaseLevel]->Format;
|
||||
|
||||
t = (mgaTextureObjectPtr) tObj->DriverData;
|
||||
|
||||
switch (ctx->Texture.Unit[source].EnvMode) {
|
||||
case GL_REPLACE:
|
||||
if (format == GL_RGB || format == GL_LUMINANCE) {
|
||||
*reg = g400_color_combine[unit][MGA_REPLACE];
|
||||
}
|
||||
else if (format == GL_ALPHA) {
|
||||
if (format == GL_ALPHA) {
|
||||
*reg = g400_alpha_combine[unit][MGA_REPLACE];
|
||||
}
|
||||
else {
|
||||
*reg = (TD0_color_sel_arg1 |
|
||||
TD0_alpha_sel_arg1 );
|
||||
} else if (format == GL_RGB || format == GL_LUMINANCE) {
|
||||
*reg = g400_color_combine[unit][MGA_REPLACE];
|
||||
} else {
|
||||
*reg = g400_color_alpha_combine[unit][MGA_REPLACE];
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_MODULATE:
|
||||
*reg = g400_color_combine[unit][MGA_MODULATE];
|
||||
if (format == GL_ALPHA) {
|
||||
*reg = g400_alpha_combine[unit][MGA_MODULATE];
|
||||
} else if (format == GL_RGB || format == GL_LUMINANCE) {
|
||||
*reg = g400_color_combine[unit][MGA_MODULATE];
|
||||
} else {
|
||||
*reg = g400_color_alpha_combine[unit][MGA_MODULATE];
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_DECAL:
|
||||
if (format == GL_RGB) {
|
||||
*reg = g400_color_combine[unit][MGA_DECAL];
|
||||
}
|
||||
else if ( format == GL_RGBA ) {
|
||||
#if 0
|
||||
if (unit == 0) {
|
||||
/* this doesn't work */
|
||||
*reg = (TD0_color_arg2_diffuse |
|
||||
TD0_color_alpha_currtex |
|
||||
TD0_color_alpha2inv_enable |
|
||||
TD0_color_arg2mul_alpha2 |
|
||||
TD0_color_arg1mul_alpha1 |
|
||||
TD0_color_blend_enable |
|
||||
TD0_color_arg1add_mulout |
|
||||
TD0_color_arg2add_mulout |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2 );
|
||||
*reg = g400_color_combine[unit][MGA_DECAL];
|
||||
} else if (format == GL_RGBA) {
|
||||
*reg = g400_color_alpha_combine[unit][MGA_DECAL];
|
||||
if (ctx->Texture._EnabledUnits != 0x03) {
|
||||
/* Linear blending mode needs dual texturing enabled */
|
||||
*(reg+1) = (TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2);
|
||||
mmesa->dualtex_env = GL_TRUE;
|
||||
}
|
||||
else {
|
||||
*reg = (TD0_color_arg2_prevstage |
|
||||
TD0_color_alpha_currtex |
|
||||
TD0_color_alpha2inv_enable |
|
||||
TD0_color_arg2mul_alpha2 |
|
||||
TD0_color_arg1mul_alpha1 |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2 );
|
||||
}
|
||||
#else
|
||||
/* s/w fallback, pretty sure we can't do in h/w */
|
||||
FALLBACK( ctx, MGA_FALLBACK_TEXTURE, GL_TRUE );
|
||||
if ( MGA_DEBUG & DEBUG_VERBOSE_FALLBACK )
|
||||
fprintf( stderr, "FALLBACK: GL_DECAL RGBA texture, unit=%d\n",
|
||||
unit );
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
*reg = g400_alpha_combine[unit][MGA_DECAL];
|
||||
} else {
|
||||
/* Undefined */
|
||||
*reg = g400_alpha_combine[unit][MGA_DECAL];
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_ADD:
|
||||
if (format == GL_INTENSITY) {
|
||||
if (unit == 0) {
|
||||
*reg = ( TD0_color_arg2_diffuse |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_add_enable |
|
||||
TD0_alpha_sel_add);
|
||||
}
|
||||
else {
|
||||
*reg = ( TD0_color_arg2_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_add_enable |
|
||||
TD0_alpha_sel_add);
|
||||
}
|
||||
}
|
||||
else if (format == GL_ALPHA) {
|
||||
*reg = g400_alpha_combine[unit][MGA_ADD];
|
||||
}
|
||||
else {
|
||||
*reg = g400_color_combine[unit][MGA_ADD];
|
||||
}
|
||||
break;
|
||||
if (format == GL_ALPHA) {
|
||||
*reg = g400_alpha_combine[unit][MGA_ADD];
|
||||
} else if (format == GL_RGB || format == GL_LUMINANCE) {
|
||||
*reg = g400_color_combine[unit][MGA_ADD];
|
||||
} else if (format == GL_RGBA || format == GL_LUMINANCE_ALPHA) {
|
||||
*reg = g400_color_alpha_combine[unit][MGA_ADD];
|
||||
} else if (format == GL_INTENSITY) {
|
||||
/* Cv = Cf + Cs
|
||||
* Av = Af + As
|
||||
*/
|
||||
if (unit == 0) {
|
||||
*reg = (TD0_color_arg2_diffuse |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_add_enable |
|
||||
TD0_alpha_sel_add);
|
||||
} else {
|
||||
*reg = (TD0_color_arg2_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_add_enable |
|
||||
TD0_alpha_sel_add);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GL_BLEND:
|
||||
if (format == GL_ALPHA) {
|
||||
*reg = g400_alpha_combine[unit][MGA_BLEND];
|
||||
}
|
||||
else {
|
||||
FALLBACK( ctx, MGA_FALLBACK_TEXTURE, GL_TRUE );
|
||||
if ( MGA_DEBUG & DEBUG_VERBOSE_FALLBACK )
|
||||
fprintf( stderr, "FALLBACK: GL_BLEND envcolor=0x%08x\n",
|
||||
mmesa->envcolor );
|
||||
|
||||
/* Do singletexture GL_BLEND with 'all ones' env-color
|
||||
* by using both texture units. Multitexture gl_blend
|
||||
* is a fallback.
|
||||
*/
|
||||
if (unit == 0) {
|
||||
/* Part 1: R1 = Rf ( 1 - Rt )
|
||||
* A1 = Af At
|
||||
*/
|
||||
*reg = ( TD0_color_arg2_diffuse |
|
||||
TD0_color_arg1_inv_enable |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg1);
|
||||
*reg = g400_alpha_combine[unit][MGA_BLEND];
|
||||
} else {
|
||||
if (mmesa->blend_flags & MGA_BLEND_RGB_ZERO) {
|
||||
if (format == GL_RGB || format == GL_LUMINANCE) {
|
||||
*reg = g400_color_combine[unit][MGA_BLEND];
|
||||
} else if (format == GL_RGBA || format == GL_LUMINANCE_ALPHA) {
|
||||
*reg = g400_color_alpha_combine[unit][MGA_BLEND];
|
||||
} else if (format == GL_INTENSITY) {
|
||||
if (mmesa->blend_flags & MGA_BLEND_ALPHA_ZERO) {
|
||||
/* Cv = Cf ( 1 - Cs )
|
||||
* Av = Af ( 1 - As )
|
||||
*/
|
||||
if (unit == 0) {
|
||||
*reg = (TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg1_inv_enable |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul);
|
||||
} else {
|
||||
*reg = (TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg1_inv_enable |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_mul);
|
||||
}
|
||||
} else if (mmesa->blend_flags & MGA_BLEND_ALPHA_ONE &&
|
||||
ctx->Texture._EnabledUnits != 0x03) {
|
||||
/* C1 = Cf ( 1 - Cs )
|
||||
* A1 = Af ( 1 - As )
|
||||
*/
|
||||
*reg = (TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg1_inv_enable |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul);
|
||||
/* Cv = C1
|
||||
* Av = A1 + As
|
||||
*/
|
||||
*(reg+1) = (TD0_color_arg2_prevstage |
|
||||
TD0_color_sel_arg2 |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_add_enable |
|
||||
TD0_alpha_sel_add);
|
||||
mmesa->dualtex_env = GL_TRUE;
|
||||
} else {
|
||||
t->texenv_fallback = GL_TRUE;
|
||||
}
|
||||
}
|
||||
} else if (mmesa->blend_flags & MGA_BLEND_RGB_ONE &&
|
||||
ctx->Texture._EnabledUnits != 0x03) {
|
||||
if (format == GL_RGB || format == GL_LUMINANCE) {
|
||||
/* C1 = Cf ( 1 - Cs )
|
||||
* A1 = Af
|
||||
*/
|
||||
*reg = (TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_arg2);
|
||||
/* Cv = C1 + Cs
|
||||
* Av = A1
|
||||
*/
|
||||
*(reg+1) = (TD0_color_arg2_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2);
|
||||
mmesa->dualtex_env = GL_TRUE;
|
||||
} else if (format == GL_RGBA || format == GL_LUMINANCE_ALPHA) {
|
||||
/* C1 = Cf ( 1 - Cs )
|
||||
* A1 = Af As
|
||||
*/
|
||||
*reg = (TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul);
|
||||
/* Cv = C1 + Cs
|
||||
* Av = A1
|
||||
*/
|
||||
*(reg+1) = (TD0_color_arg2_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2);
|
||||
mmesa->dualtex_env = GL_TRUE;
|
||||
} else if (format == GL_INTENSITY) {
|
||||
if (mmesa->blend_flags & MGA_BLEND_ALPHA_ZERO) {
|
||||
/* C1 = Cf ( 1 - Cs )
|
||||
* A1 = Af ( 1 - As )
|
||||
*/
|
||||
*reg = (TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg1_inv_enable |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul);
|
||||
/* Cv = C1 + Cs
|
||||
* Av = A1
|
||||
*/
|
||||
*(reg+1) = (TD0_color_arg2_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2);
|
||||
mmesa->dualtex_env = GL_TRUE;
|
||||
} else if (mmesa->blend_flags & MGA_BLEND_ALPHA_ONE) {
|
||||
/* C1 = Cf ( 1 - Cs )
|
||||
* A1 = Af ( 1 - As )
|
||||
*/
|
||||
*reg = (TD0_color_arg1_inv_enable |
|
||||
TD0_color_arg2_diffuse |
|
||||
TD0_color_sel_mul |
|
||||
TD0_alpha_arg1_inv_enable |
|
||||
TD0_alpha_arg2_diffuse |
|
||||
TD0_alpha_sel_mul);
|
||||
/* Cv = C1 + Cs
|
||||
* Av = A1 + As
|
||||
*/
|
||||
*(reg+1) = (TD0_color_arg2_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_add_enable |
|
||||
TD0_alpha_sel_add);
|
||||
mmesa->dualtex_env = GL_TRUE;
|
||||
} else {
|
||||
t->texenv_fallback = GL_TRUE;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Part 2: R2 = R1 + Rt
|
||||
* A2 = A1
|
||||
*/
|
||||
*reg = ( TD0_color_arg2_prevstage |
|
||||
TD0_color_add_add |
|
||||
TD0_color_sel_add |
|
||||
TD0_alpha_arg2_prevstage |
|
||||
TD0_alpha_sel_arg2);
|
||||
t->texenv_fallback = GL_TRUE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GL_COMBINE_EXT:
|
||||
if (!mgaUpdateTextureEnvCombine(ctx, unit))
|
||||
t->texenv_fallback = GL_TRUE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void disable_tex( GLcontext *ctx, int unit )
|
||||
{
|
||||
mgaContextPtr mmesa = MGA_CONTEXT( ctx );
|
||||
@@ -573,7 +816,7 @@ static void disable_tex( GLcontext *ctx, int unit )
|
||||
mmesa->CurrentTexObj[unit] = NULL;
|
||||
}
|
||||
|
||||
if ( unit != 0 ) {
|
||||
if ( unit != 0 && !mmesa->dualtex_env ) {
|
||||
mmesa->setup.tdualstage1 = mmesa->setup.tdualstage0;
|
||||
}
|
||||
|
||||
@@ -586,7 +829,7 @@ static void disable_tex( GLcontext *ctx, int unit )
|
||||
mmesa->dirty |= MGA_UPLOAD_CONTEXT | (MGA_UPLOAD_TEX0 << unit);
|
||||
}
|
||||
|
||||
static GLboolean enable_tex_2d( GLcontext *ctx, int unit )
|
||||
static GLboolean enable_tex( GLcontext *ctx, int unit )
|
||||
{
|
||||
mgaContextPtr mmesa = MGA_CONTEXT(ctx);
|
||||
const int source = mmesa->tmu_source[unit];
|
||||
@@ -649,6 +892,14 @@ static GLboolean update_tex_common( GLcontext *ctx, int unit )
|
||||
t->setup.texctl2 |= TMC_dualtex_enable;
|
||||
}
|
||||
|
||||
t->texenv_fallback = GL_FALSE;
|
||||
|
||||
/* Set this before mgaUpdateTextureEnvG400() since
|
||||
* GL_ARB_texture_env_crossbar may have to disable texturing.
|
||||
*/
|
||||
mmesa->setup.dwgctl &= DC_opcod_MASK;
|
||||
mmesa->setup.dwgctl |= DC_opcod_texture_trap;
|
||||
|
||||
/* FIXME: The Radeon has some cached state so that it can avoid calling
|
||||
* FIXME: UpdateTextureEnv in some cases. Is that possible here?
|
||||
*/
|
||||
@@ -680,13 +931,10 @@ static GLboolean update_tex_common( GLcontext *ctx, int unit )
|
||||
|
||||
mgaUpdateTextureEnvG200( ctx, unit );
|
||||
}
|
||||
|
||||
mmesa->setup.dwgctl &= DC_opcod_MASK;
|
||||
mmesa->setup.dwgctl |= DC_opcod_texture_trap;
|
||||
mmesa->dirty |= MGA_UPLOAD_CONTEXT | (MGA_UPLOAD_TEX0 << unit);
|
||||
|
||||
FALLBACK( ctx, MGA_FALLBACK_BORDER_MODE, t->border_fallback );
|
||||
return !t->border_fallback;
|
||||
return !t->border_fallback && !t->texenv_fallback;
|
||||
}
|
||||
|
||||
|
||||
@@ -697,8 +945,9 @@ static GLboolean updateTextureUnit( GLcontext *ctx, int unit )
|
||||
const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[source];
|
||||
|
||||
|
||||
if ( texUnit->_ReallyEnabled == TEXTURE_2D_BIT) {
|
||||
return(enable_tex_2d( ctx, unit ) &&
|
||||
if ( texUnit->_ReallyEnabled == TEXTURE_2D_BIT ||
|
||||
texUnit->_ReallyEnabled == TEXTURE_RECT_BIT ) {
|
||||
return(enable_tex( ctx, unit ) &&
|
||||
update_tex_common( ctx, unit ));
|
||||
}
|
||||
else if ( texUnit->_ReallyEnabled ) {
|
||||
@@ -718,6 +967,7 @@ void mgaUpdateTextureState( GLcontext *ctx )
|
||||
GLboolean ok;
|
||||
unsigned i;
|
||||
|
||||
mmesa->dualtex_env = GL_FALSE;
|
||||
|
||||
/* This works around a quirk with the MGA hardware. If only OpenGL
|
||||
* TEXTURE1 is enabled, then the hardware TEXTURE0 must be used. The
|
||||
@@ -740,8 +990,4 @@ void mgaUpdateTextureState( GLcontext *ctx )
|
||||
}
|
||||
|
||||
FALLBACK( ctx, MGA_FALLBACK_TEXTURE, !ok );
|
||||
|
||||
/* FIXME: I believe that ChooseVertexState should be called here instead of
|
||||
* FIXME: in mgaDDValidateState.
|
||||
*/
|
||||
}
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c,v 1.18 2002/12/16 16:18:52 dawes Exp $ */
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mga_xmesa.c,v 1.19 2003/03/26 20:43:49 tsi Exp $ */
|
||||
/*
|
||||
* Copyright 2000-2001 VA Linux Systems, Inc.
|
||||
* All Rights Reserved.
|
||||
@@ -56,11 +56,23 @@
|
||||
|
||||
#include "utils.h"
|
||||
#include "vblank.h"
|
||||
#include "dri_util.h"
|
||||
|
||||
#ifndef _SOLO
|
||||
#include "glxextensions.h"
|
||||
#endif
|
||||
|
||||
/* MGA configuration
|
||||
*/
|
||||
#include "xmlpool.h"
|
||||
|
||||
const char __driConfigOptions[] =
|
||||
DRI_CONF_BEGIN
|
||||
DRI_CONF_SECTION_PERFORMANCE
|
||||
DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
|
||||
DRI_CONF_SECTION_END
|
||||
DRI_CONF_END;
|
||||
const GLuint __driNConfigOptions = 1;
|
||||
|
||||
#ifndef MGA_DEBUG
|
||||
int MGA_DEBUG = 0;
|
||||
#endif
|
||||
@@ -97,7 +109,7 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
|
||||
&gp, sizeof(gp));
|
||||
if (ret) {
|
||||
fprintf(stderr, "drmMgaGetParam (MGA_PARAM_IRQ_NR): %d\n", ret);
|
||||
free(mgaScreen);
|
||||
FREE(mgaScreen);
|
||||
sPriv->private = NULL;
|
||||
return GL_FALSE;
|
||||
}
|
||||
@@ -106,22 +118,25 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
|
||||
mgaScreen->linecomp_sane = (sPriv->ddxMajor > 1) || (sPriv->ddxMinor > 1)
|
||||
|| ((sPriv->ddxMinor == 1) && (sPriv->ddxPatch > 0));
|
||||
#ifndef _SOLO
|
||||
if ( ! mgaScreen->linecomp_sane ) {
|
||||
PFNGLXDISABLEEXTENSIONPROC glx_disable_extension;
|
||||
if ( driCompareGLXAPIVersion( 20030813 ) >= 0 ) {
|
||||
PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
|
||||
(PFNGLXSCRENABLEEXTENSIONPROC) glXGetProcAddress( (const GLubyte *) "__glXScrEnableExtension" );
|
||||
void * const psc = sPriv->psc->screenConfigs;
|
||||
|
||||
glx_disable_extension = (PFNGLXDISABLEEXTENSIONPROC)
|
||||
glXGetProcAddress( "__glXDisableExtension" );
|
||||
if ( glx_enable_extension != NULL ) {
|
||||
if ( mgaScreen->linecomp_sane ) {
|
||||
(*glx_enable_extension)( psc, "GLX_SGI_swap_control" );
|
||||
(*glx_enable_extension)( psc, "GLX_SGI_video_sync" );
|
||||
(*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
|
||||
}
|
||||
|
||||
if ( glx_disable_extension != NULL ) {
|
||||
(*glx_disable_extension)( "GLX_SGI_swap_control" );
|
||||
(*glx_disable_extension)( "GLX_SGI_video_sync" );
|
||||
(*glx_disable_extension)( "GLX_MESA_swap_control" );
|
||||
(*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (serverInfo->chipset != MGA_CARD_TYPE_G200 &&
|
||||
serverInfo->chipset != MGA_CARD_TYPE_G400) {
|
||||
free(mgaScreen);
|
||||
FREE(mgaScreen);
|
||||
sPriv->private = NULL;
|
||||
__driUtilMessage("Unrecognized chipset");
|
||||
return GL_FALSE;
|
||||
@@ -168,7 +183,7 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
|
||||
mgaScreen->agp.size,
|
||||
(drmAddress *)&mgaScreen->agp.map) != 0)
|
||||
{
|
||||
free(mgaScreen);
|
||||
Xfree(mgaScreen);
|
||||
sPriv->private = NULL;
|
||||
__driUtilMessage("Couldn't map agp region");
|
||||
return GL_FALSE;
|
||||
@@ -194,7 +209,7 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
|
||||
serverInfo->agpTextureSize,
|
||||
(drmAddress *)&mgaScreen->texVirtual[MGA_AGP_HEAP]) != 0)
|
||||
{
|
||||
free(mgaScreen);
|
||||
FREE(mgaScreen);
|
||||
sPriv->private = NULL;
|
||||
__driUtilMessage("Couldn't map agptexture region");
|
||||
return GL_FALSE;
|
||||
@@ -214,13 +229,16 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
|
||||
mgaScreen->bufs = drmMapBufs(sPriv->fd);
|
||||
if (!mgaScreen->bufs) {
|
||||
/*drmUnmap(mgaScreen->agp_tex.map, mgaScreen->agp_tex.size);*/
|
||||
free(mgaScreen);
|
||||
FREE(mgaScreen);
|
||||
sPriv->private = NULL;
|
||||
__driUtilMessage("Couldn't map dma buffers");
|
||||
return GL_FALSE;
|
||||
}
|
||||
mgaScreen->sarea_priv_offset = serverInfo->sarea_priv_offset;
|
||||
|
||||
/* parse information in __driConfigOptions */
|
||||
driParseOptionInfo (&mgaScreen->optionCache);
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -234,14 +252,18 @@ mgaDestroyScreen(__DRIscreenPrivate *sPriv)
|
||||
fprintf(stderr, "mgaDestroyScreen\n");
|
||||
|
||||
/*drmUnmap(mgaScreen->agp_tex.map, mgaScreen->agp_tex.size);*/
|
||||
free(mgaScreen);
|
||||
|
||||
/* free all option information */
|
||||
driDestroyOptionInfo (&mgaScreen->optionCache);
|
||||
|
||||
FREE(mgaScreen);
|
||||
sPriv->private = NULL;
|
||||
}
|
||||
|
||||
|
||||
extern const struct gl_pipeline_stage _mga_render_stage;
|
||||
extern const struct tnl_pipeline_stage _mga_render_stage;
|
||||
|
||||
static const struct gl_pipeline_stage *mga_pipeline[] = {
|
||||
static const struct tnl_pipeline_stage *mga_pipeline[] = {
|
||||
&_tnl_vertex_transform_stage,
|
||||
&_tnl_normal_transform_stage,
|
||||
&_tnl_lighting_stage,
|
||||
@@ -263,6 +285,10 @@ static const char * const g400_extensions[] =
|
||||
"GL_ARB_multitexture",
|
||||
"GL_ARB_texture_env_add",
|
||||
"GL_EXT_texture_env_add",
|
||||
"GL_ARB_texture_env_combine",
|
||||
"GL_EXT_texture_env_combine",
|
||||
"GL_ARB_texture_env_crossbar",
|
||||
"GL_ATI_texture_env_combine3",
|
||||
"GL_EXT_texture_edge_clamp",
|
||||
"GL_SGIS_texture_edge_clamp",
|
||||
#if defined (MESA_packed_depth_stencil)
|
||||
@@ -286,6 +312,7 @@ static const char * const card_extensions[] =
|
||||
"GL_MESA_ycbcr_texture",
|
||||
"GL_SGIS_generate_mipmap",
|
||||
"GL_SGIS_texture_lod",
|
||||
"GL_NV_texture_rectangle",
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -353,6 +380,10 @@ mgaCreateContext( const __GLcontextModes *mesaVis,
|
||||
mmesa->sarea = (void *)saPriv;
|
||||
mmesa->glBuffer = NULL;
|
||||
|
||||
/* Parse configuration files */
|
||||
driParseConfigFiles (&mmesa->optionCache, &mgaScreen->optionCache,
|
||||
sPriv->myNum, "mga");
|
||||
|
||||
(void) memset( mmesa->texture_heaps, 0, sizeof( mmesa->texture_heaps ) );
|
||||
make_empty_list( & mmesa->swapped );
|
||||
|
||||
@@ -388,10 +419,10 @@ mgaCreateContext( const __GLcontextModes *mesaVis,
|
||||
mmesa->nr_heaps,
|
||||
& ctx->Const,
|
||||
4,
|
||||
11, /* max 2D texture size is 1024x1024 */
|
||||
11, /* max 2D texture size is 2048x2048 */
|
||||
0, /* 3D textures unsupported. */
|
||||
0, /* cube textures unsupported. */
|
||||
0, /* texture rectangles unsupported. */
|
||||
11, /* max texture rect size is 2048x2048 */
|
||||
maxlevels,
|
||||
GL_FALSE );
|
||||
|
||||
@@ -487,14 +518,15 @@ mgaCreateContext( const __GLcontextModes *mesaVis,
|
||||
|
||||
mmesa->vblank_flags = ((mmesa->mgaScreen->irq == 0)
|
||||
|| !mmesa->mgaScreen->linecomp_sane)
|
||||
? VBLANK_FLAG_NO_IRQ : driGetDefaultVBlankFlags();
|
||||
? VBLANK_FLAG_NO_IRQ : driGetDefaultVBlankFlags(&mmesa->optionCache);
|
||||
#ifndef _SOLO
|
||||
mmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( "__glXGetUST" );
|
||||
if ( mmesa->get_ust == NULL )
|
||||
#endif
|
||||
{
|
||||
mmesa->get_ust = (PFNGLXGETUSTPROC) glXGetProcAddress( (const GLubyte *) "__glXGetUST" );
|
||||
if ( mmesa->get_ust == NULL ) {
|
||||
mmesa->get_ust = get_ust_nop;
|
||||
}
|
||||
#else
|
||||
mmesa->get_ust = get_ust_nop;
|
||||
#endif
|
||||
|
||||
(*mmesa->get_ust)( & mmesa->swap_ust );
|
||||
|
||||
@@ -541,6 +573,9 @@ mgaDestroyContext(__DRIcontextPrivate *driContextPriv)
|
||||
}
|
||||
}
|
||||
|
||||
/* free the option cache */
|
||||
driDestroyOptionCache (&mmesa->optionCache);
|
||||
|
||||
FREE(mmesa);
|
||||
}
|
||||
|
||||
@@ -614,6 +649,7 @@ mgaMakeCurrent(__DRIcontextPrivate *driContextPriv,
|
||||
mgaContextPtr mmesa = (mgaContextPtr) driContextPriv->driverPrivate;
|
||||
|
||||
if (mmesa->driDrawable != driDrawPriv) {
|
||||
driDrawableInitVBlank( driDrawPriv, mmesa->vblank_flags );
|
||||
mmesa->driDrawable = driDrawPriv;
|
||||
mmesa->dirty = ~0;
|
||||
mmesa->dirty_cliprects = (MGA_FRONT|MGA_BACK);
|
||||
@@ -647,7 +683,7 @@ void mgaGetLock( mgaContextPtr mmesa, GLuint flags )
|
||||
|
||||
if (*(dPriv->pStamp) != mmesa->lastStamp) {
|
||||
mmesa->lastStamp = *(dPriv->pStamp);
|
||||
mmesa->SetupNewInputs |= VERT_BIT_CLIP;
|
||||
mmesa->SetupNewInputs |= VERT_BIT_POS;
|
||||
mmesa->dirty_cliprects = (MGA_FRONT|MGA_BACK);
|
||||
mgaUpdateRects( mmesa, (MGA_FRONT|MGA_BACK) );
|
||||
}
|
||||
@@ -714,30 +750,6 @@ void *__driCreateScreen(struct DRIDriverRec *driver,
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef _SOLO
|
||||
/* This function is called by libGL.so as soon as libGL.so is loaded.
|
||||
* This is where we'd register new extension functions with the dispatcher.
|
||||
*/
|
||||
void
|
||||
__driRegisterExtensions( void )
|
||||
{
|
||||
PFNGLXENABLEEXTENSIONPROC glx_enable_extension;
|
||||
|
||||
|
||||
if ( driCompareGLXAPIVersion( 20030317 ) >= 0 ) {
|
||||
glx_enable_extension = (PFNGLXENABLEEXTENSIONPROC)
|
||||
glXGetProcAddress( "__glXEnableExtension" );
|
||||
|
||||
if ( glx_enable_extension != NULL ) {
|
||||
(*glx_enable_extension)( "GLX_SGI_swap_control", GL_FALSE );
|
||||
(*glx_enable_extension)( "GLX_SGI_video_sync", GL_FALSE );
|
||||
(*glx_enable_extension)( "GLX_MESA_swap_control", GL_FALSE );
|
||||
(*glx_enable_extension)( "GLX_MESA_swap_frame_usage", GL_FALSE );
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Get information about previous buffer swaps.
|
||||
*/
|
||||
|
@@ -36,6 +36,7 @@
|
||||
#include "mtypes.h"
|
||||
#include "mgaregs.h"
|
||||
#include "mga_common.h"
|
||||
#include "xmlconfig.h"
|
||||
|
||||
typedef struct mga_screen_private_s {
|
||||
|
||||
@@ -78,6 +79,9 @@ typedef struct mga_screen_private_s {
|
||||
drmRegion primary;
|
||||
drmRegion buffers;
|
||||
unsigned int sarea_priv_offset;
|
||||
|
||||
/* Configuration cache with default values for all contexts */
|
||||
driOptionCache optionCache;
|
||||
} mgaScreenPrivate;
|
||||
|
||||
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include "mga_sarea.h"
|
||||
#include "texmem.h"
|
||||
#include "macros.h"
|
||||
#include "xmlconfig.h"
|
||||
|
||||
#define MGA_SET_FIELD(reg,mask,val) reg = ((reg) & (mask)) | ((val) & ~(mask))
|
||||
#define MGA_FIELD(field,val) (((val) << (field ## _SHIFT)) & ~(field ## _MASK))
|
||||
@@ -79,10 +80,12 @@ typedef void (*mga_point_func)( mgaContextPtr, mgaVertex * );
|
||||
|
||||
|
||||
|
||||
/* Reasons why the GL_BLEND fallback mightn't work:
|
||||
/* GL_BLEND has some limitations
|
||||
*/
|
||||
#define MGA_BLEND_ENV_COLOR 0x1
|
||||
#define MGA_BLEND_MULTITEX 0x2
|
||||
#define MGA_BLEND_RGB_ZERO 0x1
|
||||
#define MGA_BLEND_RGB_ONE 0x2
|
||||
#define MGA_BLEND_ALPHA_ZERO 0x4
|
||||
#define MGA_BLEND_ALPHA_ONE 0x8
|
||||
|
||||
struct mga_texture_object_s;
|
||||
struct mga_screen_private_s;
|
||||
@@ -149,6 +152,10 @@ typedef struct mga_texture_object_s
|
||||
* to fallback for GL_CLAMP_TO_BORDER.
|
||||
*/
|
||||
GLboolean border_fallback;
|
||||
/* Depending on multitxturing and environment color
|
||||
* GL_BLEND may have to be a software fallback.
|
||||
*/
|
||||
GLboolean texenv_fallback;
|
||||
} mgaTextureObject_t;
|
||||
|
||||
struct mga_hw_state {
|
||||
@@ -202,10 +209,11 @@ struct mga_context_t {
|
||||
struct gl_client_array UbyteColor;
|
||||
struct gl_client_array UbyteSecondaryColor;
|
||||
|
||||
/* Support for limited GL_BLEND fallback
|
||||
/* Support for GL_DECAL and GL_BLEND
|
||||
*/
|
||||
unsigned int blend_flags;
|
||||
unsigned int envcolor;
|
||||
GLboolean dualtex_env;
|
||||
|
||||
/* Rasterization state
|
||||
*/
|
||||
@@ -299,6 +307,10 @@ struct mga_context_t {
|
||||
__DRIscreenPrivate *driScreen;
|
||||
struct mga_screen_private_s *mgaScreen;
|
||||
MGASAREAPrivPtr sarea;
|
||||
|
||||
/* Configuration cache
|
||||
*/
|
||||
driOptionCache optionCache;
|
||||
};
|
||||
|
||||
#define MGA_CONTEXT(ctx) ((mgaContextPtr)(ctx->DriverCtx))
|
||||
|
@@ -26,9 +26,8 @@
|
||||
* Gareth Hughes <gareth@valinux.com>
|
||||
*/
|
||||
/* $XFree86: xc/lib/GL/mesa/src/drv/mga/mgaioctl.c,v 1.16 2002/12/16 16:18:52 dawes Exp $ */
|
||||
|
||||
#include <sched.h>
|
||||
#include <errno.h>
|
||||
#include <sched.h>
|
||||
|
||||
#include "mtypes.h"
|
||||
#include "macros.h"
|
||||
|
@@ -101,7 +101,7 @@ static void VERT_FALLBACK( GLcontext *ctx, GLuint start, GLuint count,
|
||||
tnl->Driver.Render.PrimitiveNotify( ctx, flags & PRIM_MODE_MASK );
|
||||
tnl->Driver.Render.BuildVertices( ctx, start, count, ~0 );
|
||||
tnl->Driver.Render.PrimTabVerts[flags&PRIM_MODE_MASK]( ctx, start, count, flags );
|
||||
MGA_CONTEXT(ctx)->SetupNewInputs |= VERT_BIT_CLIP;
|
||||
MGA_CONTEXT(ctx)->SetupNewInputs |= VERT_BIT_POS;
|
||||
}
|
||||
|
||||
#define LOCAL_VARS mgaContextPtr mmesa = MGA_CONTEXT(ctx)
|
||||
@@ -131,12 +131,12 @@ static void VERT_FALLBACK( GLcontext *ctx, GLuint start, GLuint count,
|
||||
|
||||
|
||||
static GLboolean mga_run_render( GLcontext *ctx,
|
||||
struct gl_pipeline_stage *stage )
|
||||
struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
mgaContextPtr mmesa = MGA_CONTEXT(ctx);
|
||||
TNLcontext *tnl = TNL_CONTEXT(ctx);
|
||||
struct vertex_buffer *VB = &tnl->vb;
|
||||
GLuint i, length, flags = 0;
|
||||
GLuint i;
|
||||
|
||||
/* Don't handle clipping or indexed vertices or vertex manipulations.
|
||||
*/
|
||||
@@ -147,13 +147,17 @@ static GLboolean mga_run_render( GLcontext *ctx,
|
||||
tnl->Driver.Render.Start( ctx );
|
||||
mmesa->SetupNewInputs = ~0;
|
||||
|
||||
for (i = VB->FirstPrimitive ; !(flags & PRIM_LAST) ; i += length)
|
||||
for (i = 0 ; i < VB->PrimitiveCount ; i++)
|
||||
{
|
||||
flags = VB->Primitive[i];
|
||||
length= VB->PrimitiveLength[i];
|
||||
if (length)
|
||||
mga_render_tab_verts[flags & PRIM_MODE_MASK]( ctx, i, i + length,
|
||||
flags );
|
||||
GLuint prim = VB->Primitive[i].mode;
|
||||
GLuint start = VB->Primitive[i].start;
|
||||
GLuint length = VB->Primitive[i].count;
|
||||
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
mga_render_tab_verts[prim & PRIM_MODE_MASK]( ctx, start, start + length,
|
||||
prim);
|
||||
}
|
||||
|
||||
tnl->Driver.Render.Finish( ctx );
|
||||
@@ -162,9 +166,9 @@ static GLboolean mga_run_render( GLcontext *ctx,
|
||||
}
|
||||
|
||||
|
||||
static void mga_check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
|
||||
static void mga_check_render( GLcontext *ctx, struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
GLuint inputs = VERT_BIT_CLIP | VERT_BIT_COLOR0;
|
||||
GLuint inputs = VERT_BIT_POS | VERT_BIT_COLOR0;
|
||||
|
||||
if (ctx->RenderMode == GL_RENDER) {
|
||||
if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR)
|
||||
@@ -184,13 +188,13 @@ static void mga_check_render( GLcontext *ctx, struct gl_pipeline_stage *stage )
|
||||
}
|
||||
|
||||
|
||||
static void dtr( struct gl_pipeline_stage *stage )
|
||||
static void dtr( struct tnl_pipeline_stage *stage )
|
||||
{
|
||||
(void)stage;
|
||||
}
|
||||
|
||||
|
||||
const struct gl_pipeline_stage _mga_render_stage =
|
||||
const struct tnl_pipeline_stage _mga_render_stage =
|
||||
{
|
||||
"mga render",
|
||||
(_DD_NEW_SEPARATE_SPECULAR |
|
||||
|
@@ -401,7 +401,7 @@ static void mgaDDColorMask(GLcontext *ctx,
|
||||
*/
|
||||
|
||||
static int mgaStipples[16] = {
|
||||
0xffff1, /* See above note */
|
||||
0xffff,
|
||||
0xa5a5,
|
||||
0x5a5a,
|
||||
0xa0a0,
|
||||
@@ -425,9 +425,6 @@ static int mgaStipples[16] = {
|
||||
*
|
||||
* \param ctx GL rendering context to be affected
|
||||
* \param mask Pointer to the 32x32 stipple mask
|
||||
*
|
||||
* \note the fully opaque pattern (0xffff) has been disabled in order
|
||||
* to work around a conformance issue.
|
||||
*/
|
||||
|
||||
static void mgaDDPolygonStipple( GLcontext *ctx, const GLubyte *mask )
|
||||
@@ -492,8 +489,7 @@ static void updateSpecularLighting( GLcontext *ctx )
|
||||
mgaContextPtr mmesa = MGA_CONTEXT(ctx);
|
||||
unsigned int specen;
|
||||
|
||||
specen = (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR &&
|
||||
ctx->Light.Enabled) ? TMC_specen_enable : 0;
|
||||
specen = (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) ? TMC_specen_enable : 0;
|
||||
|
||||
if ( specen != mmesa->hw.specen ) {
|
||||
mmesa->hw.specen = specen;
|
||||
@@ -519,14 +515,6 @@ static void mgaDDLightModelfv(GLcontext *ctx, GLenum pname,
|
||||
}
|
||||
|
||||
|
||||
static void mgaDDShadeModel(GLcontext *ctx, GLenum mode)
|
||||
{
|
||||
/* FIXME: This used to FLUSH_BATCH and set MGA_NEW_TEXTURE in new_state,
|
||||
* FIXME: so I'm not sure what to do here now.
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
/* =============================================================
|
||||
* Stencil
|
||||
*/
|
||||
@@ -671,6 +659,12 @@ static void mgaDDStencilOp(GLcontext *ctx, GLenum fail, GLenum zfail,
|
||||
case GL_DECR:
|
||||
stencilctl |= SC_szpassop_decrsat;
|
||||
break;
|
||||
case GL_INCR_WRAP:
|
||||
stencilctl |= SC_szpassop_incr;
|
||||
break;
|
||||
case GL_DECR_WRAP:
|
||||
stencilctl |= SC_szpassop_decr;
|
||||
break;
|
||||
case GL_INVERT:
|
||||
stencilctl |= SC_szpassop_invert;
|
||||
break;
|
||||
@@ -826,8 +820,10 @@ void mgaUpdateRects( mgaContextPtr mmesa, GLuint buffers )
|
||||
else
|
||||
mgaXMesaSetBackClipRects( mmesa );
|
||||
|
||||
#ifndef _SOLO
|
||||
sarea->req_drawable = driDrawable->draw;
|
||||
sarea->req_draw_buffer = mmesa->draw_buffer;
|
||||
|
||||
#endif
|
||||
mgaUpdateClipping( mmesa->glCtx );
|
||||
mgaCalcViewport( mmesa->glCtx );
|
||||
|
||||
@@ -888,6 +884,11 @@ static void mgaDDEnable(GLcontext *ctx, GLenum cap, GLboolean state)
|
||||
mgaContextPtr mmesa = MGA_CONTEXT( ctx );
|
||||
|
||||
switch(cap) {
|
||||
case GL_LIGHTING:
|
||||
case GL_COLOR_SUM_EXT:
|
||||
FLUSH_BATCH( mmesa );
|
||||
updateSpecularLighting( ctx );
|
||||
break;
|
||||
case GL_ALPHA_TEST:
|
||||
FLUSH_BATCH( mmesa );
|
||||
mmesa->hw.alpha_func_enable = (state) ? ~0 : 0;
|
||||
@@ -1034,25 +1035,24 @@ void mgaEmitHwStateLocked( mgaContextPtr mmesa )
|
||||
}
|
||||
|
||||
if ((mmesa->dirty & MGA_UPLOAD_TEX0) && mmesa->CurrentTexObj[0]) {
|
||||
mmesa->CurrentTexObj[0]->setup.texctl2 &= ~TMC_specen_enable;
|
||||
mmesa->CurrentTexObj[0]->setup.texctl2 |= mmesa->hw.specen;
|
||||
|
||||
memcpy(&sarea->TexState[0],
|
||||
&mmesa->CurrentTexObj[0]->setup,
|
||||
sizeof(sarea->TexState[0]));
|
||||
}
|
||||
|
||||
if ((mmesa->dirty & MGA_UPLOAD_TEX1) && mmesa->CurrentTexObj[1]) {
|
||||
mmesa->CurrentTexObj[1]->setup.texctl2 &= ~TMC_specen_enable;
|
||||
mmesa->CurrentTexObj[1]->setup.texctl2 |= mmesa->hw.specen;
|
||||
|
||||
memcpy(&sarea->TexState[1],
|
||||
&mmesa->CurrentTexObj[1]->setup,
|
||||
sizeof(sarea->TexState[1]));
|
||||
}
|
||||
|
||||
if ( (sarea->TexState[0].texctl2 & TMC_borderen_MASK) !=
|
||||
(sarea->TexState[1].texctl2 & TMC_borderen_MASK) ) {
|
||||
if (mmesa->dualtex_env) {
|
||||
sarea->TexState[0].texctl2 |= TMC_dualtex_enable;
|
||||
memcpy( &sarea->TexState[1], &sarea->TexState[0],
|
||||
sizeof(sarea->TexState[0]) );
|
||||
mmesa->dirty |= MGA_UPLOAD_TEX1|MGA_UPLOAD_TEX0;
|
||||
} else if ( (sarea->TexState[0].texctl2 & TMC_borderen_MASK) !=
|
||||
(sarea->TexState[1].texctl2 & TMC_borderen_MASK) ) {
|
||||
const int borderen = sarea->TexState[1].texctl2 & ~TMC_borderen_MASK;
|
||||
|
||||
memcpy( &sarea->TexState[1], &sarea->TexState[0],
|
||||
@@ -1070,15 +1070,10 @@ void mgaEmitHwStateLocked( mgaContextPtr mmesa )
|
||||
mmesa->sarea->dirty |= mmesa->dirty;
|
||||
mmesa->dirty &= MGA_UPLOAD_CLIPRECTS;
|
||||
|
||||
/* This is a bit of a hack but seems to be the best place to ensure
|
||||
* that separate specular is disabled when not needed.
|
||||
*/
|
||||
if (ctx->Texture._EnabledUnits == 0 ||
|
||||
!ctx->Light.Enabled ||
|
||||
ctx->Light.Model.ColorControl == GL_SINGLE_COLOR) {
|
||||
sarea->TexState[0].texctl2 &= ~TMC_specen_enable;
|
||||
sarea->TexState[1].texctl2 &= ~TMC_specen_enable;
|
||||
}
|
||||
sarea->TexState[0].texctl2 &= ~TMC_specen_enable;
|
||||
sarea->TexState[1].texctl2 &= ~TMC_specen_enable;
|
||||
sarea->TexState[0].texctl2 |= mmesa->hw.specen;
|
||||
sarea->TexState[1].texctl2 |= mmesa->hw.specen;
|
||||
}
|
||||
|
||||
|
||||
@@ -1089,23 +1084,23 @@ void mgaEmitHwStateLocked( mgaContextPtr mmesa )
|
||||
static void mgaDDValidateState( GLcontext *ctx )
|
||||
{
|
||||
mgaContextPtr mmesa = MGA_CONTEXT( ctx );
|
||||
int new_state = mmesa->NewGLState;
|
||||
|
||||
|
||||
FLUSH_BATCH( mmesa );
|
||||
|
||||
if (mmesa->NewGLState & _MGA_NEW_RASTERSETUP) {
|
||||
mgaChooseVertexState( ctx );
|
||||
}
|
||||
|
||||
if (mmesa->NewGLState & _MGA_NEW_RENDERSTATE) {
|
||||
mgaChooseRenderState( ctx );
|
||||
}
|
||||
|
||||
if (new_state & _NEW_TEXTURE) {
|
||||
if (mmesa->NewGLState & _NEW_TEXTURE) {
|
||||
mgaUpdateTextureState(ctx);
|
||||
}
|
||||
|
||||
if (!mmesa->Fallback) {
|
||||
if (mmesa->NewGLState & _MGA_NEW_RASTERSETUP) {
|
||||
mgaChooseVertexState( ctx );
|
||||
}
|
||||
|
||||
if (mmesa->NewGLState & _MGA_NEW_RENDERSTATE) {
|
||||
mgaChooseRenderState( ctx );
|
||||
}
|
||||
}
|
||||
|
||||
mmesa->NewGLState = 0;
|
||||
}
|
||||
|
||||
@@ -1186,13 +1181,14 @@ void mgaInitState( mgaContextPtr mmesa )
|
||||
break;
|
||||
}
|
||||
|
||||
mmesa->hw.blend_func = AC_src_one | AC_dst_zero;
|
||||
mmesa->hw.zmode = DC_zmode_zlt | DC_atype_zi;
|
||||
mmesa->hw.stencil = (0x0ff << S_smsk_SHIFT) | (0x0ff << S_swtmsk_SHIFT);
|
||||
mmesa->hw.stencilctl = SC_smode_salways | SC_sfailop_keep
|
||||
| SC_szfailop_keep | SC_szpassop_keep;
|
||||
mmesa->hw.stencil_enable = 0;
|
||||
mmesa->hw.cull = _CULL_NEGATIVE;
|
||||
mmesa->hw.cull_dualtex = _CULL_POSITIVE;
|
||||
mmesa->hw.cull = _CULL_DISABLE;
|
||||
mmesa->hw.cull_dualtex = _CULL_DISABLE;
|
||||
mmesa->hw.specen = 0;
|
||||
|
||||
mmesa->setup.dwgctl = (DC_opcod_trap |
|
||||
@@ -1227,6 +1223,10 @@ void mgaInitState( mgaContextPtr mmesa )
|
||||
mmesa->setup.tdualstage1 = 0;
|
||||
mmesa->setup.fcol = 0;
|
||||
mmesa->dirty |= MGA_UPLOAD_CONTEXT;
|
||||
|
||||
mmesa->envcolor = 0;
|
||||
mmesa->blend_flags = MGA_BLEND_RGB_ZERO | MGA_BLEND_ALPHA_ZERO;
|
||||
mmesa->dualtex_env = GL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
@@ -1243,7 +1243,6 @@ void mgaDDInitStateFuncs( GLcontext *ctx )
|
||||
ctx->Driver.DepthMask = mgaDDDepthMask;
|
||||
ctx->Driver.Fogfv = mgaDDFogfv;
|
||||
ctx->Driver.Scissor = mgaDDScissor;
|
||||
ctx->Driver.ShadeModel = mgaDDShadeModel;
|
||||
ctx->Driver.CullFace = mgaDDCullFaceFrontFace;
|
||||
ctx->Driver.FrontFace = mgaDDCullFaceFrontFace;
|
||||
ctx->Driver.ColorMask = mgaDDColorMask;
|
||||
|
@@ -221,7 +221,7 @@ mgaChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
|
||||
case GL_ALPHA16:
|
||||
case GL_COMPRESSED_ALPHA:
|
||||
/* FIXME: This will report incorrect component sizes... */
|
||||
return &_mesa_texformat_argb4444;
|
||||
return MGA_IS_G400(mmesa) ? &_mesa_texformat_al88 : &_mesa_texformat_argb4444;
|
||||
|
||||
case 1:
|
||||
case GL_LUMINANCE:
|
||||
@@ -231,7 +231,7 @@ mgaChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
|
||||
case GL_LUMINANCE16:
|
||||
case GL_COMPRESSED_LUMINANCE:
|
||||
/* FIXME: This will report incorrect component sizes... */
|
||||
return &_mesa_texformat_rgb565;
|
||||
return MGA_IS_G400(mmesa) ? &_mesa_texformat_al88 : &_mesa_texformat_rgb565;
|
||||
|
||||
case 2:
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
@@ -243,7 +243,7 @@ mgaChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
|
||||
case GL_LUMINANCE16_ALPHA16:
|
||||
case GL_COMPRESSED_LUMINANCE_ALPHA:
|
||||
/* FIXME: This will report incorrect component sizes... */
|
||||
return &_mesa_texformat_argb4444;
|
||||
return MGA_IS_G400(mmesa) ? &_mesa_texformat_al88 : &_mesa_texformat_argb4444;
|
||||
|
||||
case GL_INTENSITY:
|
||||
case GL_INTENSITY4:
|
||||
@@ -252,7 +252,7 @@ mgaChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
|
||||
case GL_INTENSITY16:
|
||||
case GL_COMPRESSED_INTENSITY:
|
||||
/* FIXME: This will report incorrect component sizes... */
|
||||
return &_mesa_texformat_argb4444;
|
||||
return MGA_IS_G400(mmesa) ? &_mesa_texformat_i8 : &_mesa_texformat_argb4444;
|
||||
|
||||
case GL_YCBCR_MESA:
|
||||
if (MGA_IS_G400(mmesa) &&
|
||||
@@ -309,6 +309,7 @@ mgaAllocTexObj( struct gl_texture_object *tObj )
|
||||
| TF_uvoffset_OGL);
|
||||
|
||||
t->border_fallback = GL_FALSE;
|
||||
t->texenv_fallback = GL_FALSE;
|
||||
|
||||
make_empty_list( & t->base );
|
||||
|
||||
@@ -328,31 +329,31 @@ static void mgaDDTexEnv( GLcontext *ctx, GLenum target,
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
mgaContextPtr mmesa = MGA_CONTEXT(ctx);
|
||||
|
||||
|
||||
switch( pname ) {
|
||||
case GL_TEXTURE_ENV_COLOR: {
|
||||
GLubyte c[4];
|
||||
GLuint envColor;
|
||||
|
||||
UNCLAMPED_FLOAT_TO_RGBA_CHAN( c, texUnit->EnvColor );
|
||||
envColor = mgaPackColor( mmesa->mgaScreen->cpp, c[0], c[1], c[2], c[3] );
|
||||
mmesa->envcolor = PACK_COLOR_8888( c[3], c[0], c[1], c[2] );
|
||||
|
||||
if (mmesa->setup.fcol != envColor) {
|
||||
if (mmesa->setup.fcol != mmesa->envcolor) {
|
||||
FLUSH_BATCH(mmesa);
|
||||
mmesa->setup.fcol = envColor;
|
||||
mmesa->setup.fcol = mmesa->envcolor;
|
||||
mmesa->dirty |= MGA_UPLOAD_CONTEXT;
|
||||
|
||||
mmesa->blend_flags &= ~MGA_BLEND_ENV_COLOR;
|
||||
mmesa->blend_flags = 0;
|
||||
|
||||
/* Actually just require all four components to be
|
||||
* equal. This permits a single-pass GL_BLEND.
|
||||
*
|
||||
* More complex multitexture/multipass fallbacks
|
||||
* for blend can be done later.
|
||||
*/
|
||||
if (mmesa->envcolor != 0x0 && mmesa->envcolor != 0xffffffff)
|
||||
mmesa->blend_flags |= MGA_BLEND_ENV_COLOR;
|
||||
if ((mmesa->envcolor & 0xffffff) == 0x0) {
|
||||
mmesa->blend_flags |= MGA_BLEND_RGB_ZERO;
|
||||
} else if ((mmesa->envcolor & 0xffffff) == 0xffffff) {
|
||||
mmesa->blend_flags |= MGA_BLEND_RGB_ONE;
|
||||
}
|
||||
|
||||
if ((mmesa->envcolor >> 24) == 0x0) {
|
||||
mmesa->blend_flags |= MGA_BLEND_ALPHA_ZERO;
|
||||
} else if ((mmesa->envcolor >> 24) == 0xff) {
|
||||
mmesa->blend_flags |= MGA_BLEND_ALPHA_ONE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -445,8 +446,9 @@ mgaDDTexParameter( GLcontext *ctx, GLenum target,
|
||||
* to do anything now
|
||||
*/
|
||||
|
||||
if ( (t == NULL)
|
||||
|| (target != GL_TEXTURE_2D) ) {
|
||||
if ( (t == NULL) ||
|
||||
(target != GL_TEXTURE_2D &&
|
||||
target != GL_TEXTURE_RECTANGLE_NV) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -492,7 +494,8 @@ static void
|
||||
mgaDDBindTexture( GLcontext *ctx, GLenum target,
|
||||
struct gl_texture_object *tObj )
|
||||
{
|
||||
if ( target == GL_TEXTURE_2D ) {
|
||||
if ( target == GL_TEXTURE_2D ||
|
||||
target == GL_TEXTURE_RECTANGLE_NV ) {
|
||||
if ( tObj->DriverData == NULL ) {
|
||||
mgaAllocTexObj( tObj );
|
||||
}
|
||||
@@ -547,5 +550,7 @@ mgaDDInitTextureFuncs( GLcontext *ctx )
|
||||
ctx->Driver.TexEnv = mgaDDTexEnv;
|
||||
ctx->Driver.TexParameter = mgaDDTexParameter;
|
||||
|
||||
driInitTextureObjects( ctx, & mmesa->swapped, DRI_TEXMGR_DO_TEXTURE_2D );
|
||||
driInitTextureObjects( ctx, & mmesa->swapped,
|
||||
(DRI_TEXMGR_DO_TEXTURE_2D |
|
||||
DRI_TEXMGR_DO_TEXTURE_RECT) );
|
||||
}
|
||||
|
@@ -46,4 +46,6 @@ void mgaDestroyTexObj( mgaContextPtr mmesa, mgaTextureObjectPtr t );
|
||||
|
||||
void mgaDDInitTextureFuncs( GLcontext *ctx );
|
||||
|
||||
GLboolean mgaUpdateTextureEnvCombine( GLcontext *ctx, int unit );
|
||||
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user